1

4 バイトのメモリ スロットは、定義されたすべての整数用に予約されています。初期化されていない変数は、そのスロットの古い値を保持します。したがって、初期値は何らかの形でランダム化されています。

int x = 5; // definition with initialisation

この事実は、私が知る限り、ほとんどの C++ コンパイラでスコープ付き変数にも当てはまります。しかし、グローバル変数に関しては。ゼロの値が設定されます。

int x; // uninitialised definition

グローバル変数とスコープ変数の初期値に関して、C++ コンパイラの動作が異なるのはなぜですか。

それは基本的なものですか?

4

3 に答える 3

4

名前空間レベルの変数 (グローバルを意味する) は静的ストレージ期間に属し、標準に従って、静的ストレージ期間を持つすべての変数は静的に初期化されます。つまり、すべてのビットが 0 に設定されます。

C++ 標準 (n3242) の §3.6.2/2 によると、

静的保存期間(3.7.1) またはスレッド保存期間 (3.7.2)を持つ変数は、他の初期化が行われる前にゼロで初期化されます(8.5)。

自動保存期間を持つローカル変数の場合、標準はコンパイラにそのような要件を課しません。そのため、自動変数は通常、パフォーマンス上の理由から初期化されていません。自動変数も初期化するコンパイラがあるかもしれませんが、ほとんどすべての主要なコンパイラはこのアプローチを選択します。

于 2013-09-26T18:32:40.500 に答える