0

重複の可能性:
最適化されたC ++コンパイラは関数のスタックスロットをどのように再利用しますか?

C ++コンパイラには、スタックメモリを使用して最適化するために、関数内の各ローカル変数の有効期間が終了する時刻を決定する方法がありますか、それとも単に関数実行の有効期間と等しくなりますか?

4

2 に答える 2

3

関数が戻る前に、スタック変数のメモリを再利用することはできません。これは、特定の呼び出しのスタック フレームの一部であるためです。リターン ポインターはそれらの下にあり、呼び出し元のフレームはそれらの上にあります。明らかに、リターン ポインタは関数がリターンするまで解放できないため、スタック変数はいわば岩と固い場所の間にスタックされ、それらのメモリはリターン後まで使用できないままになります。

于 2010-07-13T17:44:09.100 に答える
2

ほとんどのコンパイラは、スタック上のすべての変数に一度にメモリを割り当てます。例えば:

void f()  {
   int n = 0;      // lifetime of n begins here
   {
      int x = 0;   // lifetime of x begins here
   }               // lifetime of x ends here
}                  // lifetime of n end here 

関数のエントリで、2 つの整数に対してメモリを 1 回割り当てます。ただし、これは実装の詳細であり、プログラマには見えません。また、2 つの変数 n と x の有効期間は同じではありません。

于 2010-07-13T17:39:41.207 に答える