この些細な質問は申し訳ありませんが、私は明確な静的初期化をゼロにしていますか?私が持っている場合は言うC++でゼロへの明示的な静的初期化
a.hpp:
class A { ... static int x; }
a.cpp。
int A::x = 0;
x
に何回割り当てられますか?ゼロ初期化中に1回、またはゼロ初期化と定数式による初期化の両方で2回ですか?
この些細な質問は申し訳ありませんが、私は明確な静的初期化をゼロにしていますか?私が持っている場合は言うC++でゼロへの明示的な静的初期化
a.hpp:
class A { ... static int x; }
a.cpp。
int A::x = 0;
x
に何回割り当てられますか?ゼロ初期化中に1回、またはゼロ初期化と定数式による初期化の両方で2回ですか?
あなたのコードが実行される前に、変数の値は0になります。 どのようにそのようになるかは、システムによって大きく異なります。 1つの典型的なアプローチ は、プログラムをロードするときに、ディスクから日付のイメージを読み取ることです。 正式には初期化がゼロで、その後には静的な の初期化がありますが、準拠している実装では、 とは区別できません。
UNIXの場合、少なくとも古くて伝統的なバージョンでは、 の初期化されていない静的変数がデータセグメントの静的に初期化された変数のbsセグメントに配置されました。ディスク上の実行可能ファイル には、データセグメントのイメージが格納されていました。このイメージは、 がメモリにコピーされています。 bsセグメントのすべてのバイトが0に設定されました。 最新のマシンでは、ページングされた仮想メモリでは、 の動作が期待されますが、初期化はページが最初にアクセスされるまで まで延期されます。
Windowsがこれを(セグメントの名前を除いて)別々に処理すると、私は非常に驚くでしょう。
どのように違いが分かりますか? – MSalters