2012-01-10 18 views
2

この些細な質問は申し訳ありませんが、私は明確な静的初期化をゼロにしていますか?私が持っている場合は言うC++でゼロへの明示的な静的初期化

a.hpp:

class A { ... static int x; } 

a.cpp。

int A::x = 0; 

xに何回割り当てられますか?ゼロ初期化中に1回、またはゼロ初期化と定数式による初期化の両方で2回ですか?

+0

どのように違いが分かりますか? – MSalters

答えて

2

あなたのコードが実行される前に、変数の値は0になります。 どのようにそのようになるかは、システムによって大きく異なります。 1つの典型的なアプローチ は、プログラムをロードするときに、ディスクから日付のイメージを読み取ることです。 正式には初期化がゼロで、その後には静的な の初期化がありますが、準拠している実装では、 とは区別できません。

UNIXの場合、少なくとも古くて伝統的なバージョンでは、 の初期化されていない静的変数がデータセグメントの静的に初期化された変数のbsセグメントに配置されました。ディスク上の実行可能ファイル には、データセグメントのイメージが格納されていました。このイメージは、 がメモリにコピーされています。 bsセグメントのすべてのバイトが0に設定されました。 最新のマシンでは、ページングされた仮想メモリでは、 の動作が期待されますが、初期化はページが最初にアクセスされるまで まで延期されます。

Windowsがこれを(セグメントの名前を除いて)別々に処理すると、私は非常に驚くでしょう。

+0

私はC++について尋ねていましたが、非常に具体的な初期化の順序を保証しています。 – zzz777

+0

そして私はそれに答えました。正式には、ゼロ初期化、その後の静的初期化、動的初期化です。しかし、ダイナミック初期化の前に何が起こるかは、適合するプログラムによって決定することができないので、正しい値が得られるものは何でも良い。ほとんどのシステムは、私が記述したことを行います。 –

+0

スタティック初期化は2つのステップで実行されますが、ここではどちらを使用するのか不思議です。 – zzz777

関連する問題