2012-04-17 8 views
7

プログラム全体の特定のオブジェクトに対する静的オブジェクト初期化の順序を保証する方法はありますか。私はプログラム中の最初のものとして割り当てられるメモリアロケータを持っています。プログラム全体でこれらのアロケータを使用して後ですべてのメモリを割り当てる必要があるからです。コンパイラ固有のメモリ初期化

私はこれがおそらくコンパイラ固有であると理解していますが、C++標準ではこれが許されているとは思えません。私がこれを行うのに興味がある2つのコンパイラは、gccとVS2010のコンパイラです。方法がある場合、誰かがどのように説明することができますか?アロケータは、プログラムの開始時に、私は初期化したいメモリの大きなブロックを割り当てることになるので、私は「最初の使用上の構築」したくない

EDIT

+1

「静的オブジェクトの初期化の順序を保証する」という意味ですか? – Griwes

+1

なぜ誰かがdownvoteでしたか? – chadb

+5

あなたの質問を書き換えることができます。それはあまり意味がないので、それは – Grizzly

答えて

7

コンパイラ固有のディレクティブを使用して、初期化の順序に多少の影響を与えることができます。 MSVCにはプラグマがあり、特定のモジュールの優先度を多少設定できるプラグマがあります。 init_segについては、このリファレンスを参照してください。

gccコンパイラは、相対を特定の初期化の優先度に設定するための類似の/関連する属性構文を持っています。これは次のようになります

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

init_priorityで説明されています。

+1

非常に興味深い。 MSVCのSome_Classを行う方法の例を教えてください。 – josephthomas

+1

@Bo Persson:MSVCのSome_Classの例を表示できますか?ドキュメントを読んだあと、Some_Class Aと似たようなことは考えられません(私はそれが可能だと信じていますが、ドキュメンテーションが言っていることですが、それを達成できないようです)。 – chadb

+0

MSVCとまったく同じ機能を得ることはできません。 'Some_Class'のオブジェクトを初期化するファイルに' #pragma init_seg(lib) 'を追加すると、ユーザコードの前に初期化されます。個々のオブジェクトごとに正確な優先順位を得ることはできません。 –

0

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

この問題を回避するには、ここではC++ FAQで説明した最初の使用イディオムのコンストラクトは、次のとおりです。

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

+0

私は以前これを調べていましたが、アロケータがプログラムの開始時に初期化したい大きなメモリブロックを割り当てるため、「最初の使用時に構築する」ことは望ましくありません。 – chadb

+1

@chadb:多分あなたは何をしているのかをより詳しく記述するべきでしょう。あなたの質問から、私は完全に細かい(最初の使用は静的オブジェクトの構築内部にあることに注意してください)最初の使用時に構築すると仮定します。 – Grizzly

+0

したがって、最初のイニシャライザによってメモリ割り当てトリガが使用されます。 – ams

0

代わりに静的な初期化を制御しようとしているの、意志だけ原因ます時間以上将来のばかげたデバッグ時間が増えたら、メモリプールをmainの先頭に割り当ててください。それでも静的initの落とし穴がなくても、事前に割り当てられたメモリが得られます。

+0

これは、mainより前に実行され、問題のメモリに依存するすべての静的イニシャライザには少し遅れています。 – ams

+0

ハーバードアーチ。プロセッサは、プログラムメモリ上にデータを格納するために静的初期化を必要とすることがあり、通常はAVR uC上のフラッシュメモリのみを読み込みます。 を読み取り専用メモリとして使用すると、ランタイムの割り当てや初期化ができなくなります。 –

関連する問題