1

私が理解しているように、関数レベルのリンクは(明示的または非明示的に)すべての可能な呼び出しのグラフを構築し、生成されたバイナリに到達可能な関数のコードのみを含めます。しかし、ファイル レベルで宣言された変数をどのように処理するのでしょうか。

私が持っていると言う

MyClass GlobalVariable;
static MyClass StaticGlobalVariable;

これら2つの変数と、残りのコードのいずれからも実際には呼び出されない一連の関数のみを含むファイルで。

これらの変数の割り当て/初期化のコードは出力に含まれますか?

4

2 に答える 2

1

経験から(標準を引用するのではなく):

初期化に外部ライブラリの呼び出しやファイル I/O などの目に見える副作用がある場合、初期化は常に行われます。

boost::singleton_defaultは、オブジェクトが他の場所で参照されている場合にのみ初期化を強制する興味深いソリューションを提供します。つまり、オブジェクトへの他のすべての参照がリンカーによって削除されると、初期化も削除されます。

于 2009-07-08T09:49:37.997 に答える
0

編集:はい。g++ 最適化フラグは、関数呼び出しを見つけ出し、.o ファイルを削除しようとします。その結果、リンカー エラーが発生します。これが特定の最適化フラグでのみ発生するかどうかはわかりませんが、発生します。

当社の悪い習慣は、さまざまなファイルに多数の「extern g_GlobalFunction()」定義が存在することです。それらの呼び出しは条件付きコードに依存していたため、.o ファイルは破棄されることが多く、リンク エラーが発生しました。

main() から階層的に呼び出される g_InitModule() および g_InitFileName() 呼び出しでこれを修正しました。ほとんどの場合、これらは g++ が .o ファイルを破棄するのを思いとどまらせることを意図した空の関数です。

于 2009-07-08T11:18:48.020 に答える