7

プログラム全体で特定のオブジェクトの静的オブジェクトの初期化の順序を保証する方法はありますか? プログラムの最初のものとして割り当てたいメモリアロケータがあります。それらはプログラム全体の他の場所で使用されるため、これらのアロケータを使用して後のすべてのメモリを割り当てたいと考えています。

C++標準でこれが許可されているとは思わないため、これはおそらくコンパイラ固有であることを理解しています。これを行うことに興味がある 2 つのコンパイラは、gcc と VS2010 のコンパイラです。方法がある場合、誰かがその方法を説明できますか?

編集

アロケーターは、プログラムの開始時に初期化する必要がある大きなメモリ ブロックを割り当てるため、「初回使用時の構築」は必要ありません。

4

3 に答える 3

8

コンパイラ固有のディレクティブを使用して、初期化の順序に多少の影響を与えることができます。MSVC にはプラグマがあります

#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]} )

特定のモジュールの優先順位をいくらか設定できます。init_segについては、このリファレンスを参照してください。

gcc コンパイラには、特定の初期化の相対的な優先順位を設定するための類似/関連する属性構文があります。このように見えます

Some_Class  A  __attribute__ ((init_priority (2000)));
Some_Class  B  __attribute__ ((init_priority (543)));

このページのinit_priorityで説明されています。

于 2012-04-17T21:27:58.090 に答える
0

静的な初期化を制御しようとする代わりに、将来的に何時間もまたはそれ以上のばかげたデバッグ時間を引き起こすだけで、メモリのプールを の開始時に割り当てますmain。その後、静的初期化の落とし穴なしで、事前に割り当てられたメモリを取得できます。

于 2012-04-17T21:10:50.143 に答える
0

静的初期化順序の大失敗を参照していると推測しています。これにより、静的変数が別の静的変数の状態に基づいて初期化されるときに、プログラムが未定義の動作を呼び出す可能性があります(コンストラクターがある場合とない場合があります)その際に呼ばれる)。

この問題の回避策は、C++ の FAQ で説明されている、最初に使用するイディオムの構文です。

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

于 2012-04-17T21:02:56.037 に答える