if ステートメントで配列を定義すると、コンパイル時にメモリが割り当てられます。
if(1)
{
int a[1000];
}
else
{
float b[1000];
}
次に、2 * 1000
ints + 4 * 1000
floats のメモリが割り当てられますか?
実行時にスタックで予約されます(重要な条件を想定しています-あなたの場合、コンパイラはそのelse
部分を除外するだけです)。つまり、スコープ ブロック内 ( の間{}
) にのみ存在します。
あなたの例では、int のメモリのみがスタックに割り当てられます (1000 * sizeof(int))。
ご想像のとおり、これは実行時に行われます。生成されたコードには、対応するコード ブロックが入力されたときにスタックにスペースを割り当てる命令が含まれています。
これは、言語のセマンティクスが原因で発生していることに注意してください。ブロック構造は新しいスコープを導入し、そのスコープに割り当てられた自動変数には、スコープが存続する限り存続する寿命があります。C では、これはスタックに割り当てることで実装され、スコープが消えると折りたたまれます。
ポイントを理解してもらうために、変数の性質が異なると、割り当てが異なることに注意してください。
if(1)
{
static int a[1000];
}
else
{
static float b[1000];
}
この場合、スペースは int と float の両方に割り当てられます。これらの変数の存続期間はプログラムです。ただし、可視性はそれらが割り当てられているブロック スコープ内にあります。