2009-07-08 4 views
1

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

は、私が唯一のこれらの二つの変数と、実際に残りのコードのいずれかから呼び出されていない関数のセットが含まれているいくつかのファイルに

MyClass GlobalVariable; 
static MyClass StaticGlobalVariable; 

を持っていると言います。

これらの変数の割り当て/初期化のコードを出力に含めますか?経験(というよりも標準を引用)から

答えて

1

:initilaizationが外部ライブラリやファイルへの呼び出しI/Oなどの目に見える副作用を持っている場合

は、初期化は常に起こります。

boost::singleton_defaultは、オブジェクトが他の場所で参照されている場合、つまりオブジェクトに対する他のすべての参照がリンカによって削除された場合にのみ、初期化が行われるという興味深い解決策を提供します。

0

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

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

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

関連する問題