16

一時オブジェクトが動的(ヒープ)メモリに格納されているというのは本当ですか?

4

4 に答える 4

10

標準では、それらのメモリ領域(ヒープ/スタック)は必須ではありませんが、式の最後にある(またはref-to-constにバインドされている場合はそれより長い)ローカル変数の「自動ストレージ」と同じです。破壊されます。

ほとんどの実装は、ローカル変数と同じようにそれらをスタックに格納します。

編集:

As James Kanze pointed out: In the case the lifetime of a temporary is extended via a ref-to-const, its store location is on most implementations somewhat determined by the storage location of that reference. That is, in the case of the reference being in static storage, the temporary will be too (just confirmed on gcc). (although IMHO while this is still a temporary in the standards sense, it is arguable whether this is a temporary in the intuitive english sense of that word)

于 2012-02-02T09:27:43.837 に答える
7

それは彼らの寿命に依存します。有効期間を長くするためにローカルの静的参照にバインドしない関数内で作成する一時オブジェクトは、スタック上に作成される可能性が最も高くなります。ローカルの静的参照にバインドする一時ファイルは、ほとんどの場合、プログラム バイナリの .data セクションに格納されます。非ローカル参照にバインドする一時オブジェクトについても同じことが言えます。参照によってバインドされたもの以外の非ローカル変数の初期化中に作成される一時変数は、その非ローカル変数の値を生成する関数のスタック上にある必要があります。

アンワインド中にスローされたオブジェクトを表す例外オブジェクトも一時的です。それらは通常、ヒープに常駐します。

于 2012-02-02T09:49:07.457 に答える
4

これは実装に大きく依存しますが、おそらく自動ストレージに存在します。

最適化のため、スコープは直感に反する可能性があることに注意してください。

以下:

class A
{
//...
};

//....

A foo()
{
   A a;
   return a;
}

ここで、オブジェクトaは必ずしも関数のスコープ内にのみ存在するわけではありませんが、RVOが発生する可能性があります。

また、一時オブジェクトを値で渡す場合、すぐに破棄されない場合があります。

void foo(A a);
//...

foo( A() );

ここで、一時は必ずしもその行で生きているだけでなく、メソッドの引数スタック内に直接構築することができます。

于 2012-02-02T09:27:08.593 に答える
0

ほとんどの(すべてではないにしても)実装はそれらをスタック(つまり自動ストレージ)に格納しますが、標準ではどこにも義務付けられていないと思います。コンパイラは一時変数の有効期間を保証する必要があるため、このようにする方が確かに簡単です。また、この有効期間には同じ関数の再帰呼び出しが含まれ、一時変数の別のインスタンスが作成される可能性があります。

于 2012-02-02T09:31:08.230 に答える