4

C++03 標準[basic.start.init] ポイント 3は次のように述べています。

名前空間スコープのオブジェクトの動的初期化 (8.5、9.4、12.1、12.6.1) が main の最初のステートメントの前に行われるかどうかは実装定義です。初期化が main の最初のステートメントの後のある時点まで延期される場合、初期化されるオブジェクトと同じ翻訳単位で定義された関数またはオブジェクトが最初に使用される前に発生するものとします。

Microsoft コンパイラは、 Additional Startup Considerationsに従って、の前に初期化を実行しますmain()

GNU および Sun Forte コンパイラの動作を記述したドキュメントを入手できませんでした。

誰でもできます:

  1. 動的初期化に関する GNU および Forte コンパイラの動作を説明するドキュメントの方向を教えてください (GCC のマニュアルを確認しましたが、動的初期化に関連するものは何も見つかりませんでした)。
  2. 遅延動的初期化のスレッド セーフについてコメントします (2 つのスレッドが非ローカル オブジェクトを含む同じ変換単位から関数を呼び出そうとした場合)。

FWIW、私は GNU の g++ と SUN の CC の動作を観察し、どちらもメインの前に初期化を実行しましたが、これを決定的な答えとして受け入れません。(誰かが興味を持っているかどうかを観察するために使用した非常に単純なコードを投稿できますが、質問が十分に長いと感じました

4

1 に答える 1

5

決定的な答えは、後でロードされる DLL にオブジェクトが含まれていない限りmain、すべてのコンパイラが の前に静的初期化を行うことです。実際には、他の方法で引用するテキストの要件を満たすことは (ほとんど) 不可能です。(循環があるとどうなるか考えてみてください。)

于 2012-09-07T16:33:52.233 に答える