4

C++ 標準では、const 参照を右辺値にバインドできるため、参照がスコープ外になるまで、一時オブジェクトの有効期間が延長されます。ただし、これが実際にどのようにコンパイルされているのかわかりません。例を挙げて説明しましょう。

std::string foo() {
    return std::string("foo");
}

void bar() {
    VeryBigObject obj;
    // Perhaps do something with the big object
}

int main(int, char **) {
    const std::string &foo_str = foo();
    bar();
    return 0;
}

私の知る限り、例として x86 アーキテクチャを使用すると、最初に関数foo()が呼び出され、文字列オブジェクトがスタックに構築されます。つまり、必要な量のスペースがrspレジスタから差し引かれます (64ビット アーキテクチャ); その後、rspレジスタは元の値に戻り、関数foo()が埋めていたスタックスペースを解放します。正しく理解できれば、への呼び出しbar()はそのスタックスペースを使用して を構築しVeryBigObject、文字列を上書きします。

foo()これらすべてを念頭に置いて、アセンブリ ドメインでを呼び出した後、文字列の寿命を延ばすにはどうすればよいでしょうか?

4

1 に答える 1

7

一時的な戻り値は、 のスタック フレームmainから一時的なものをコピー/移動するfooか、RVO を使用してコピーを省略し、呼び出し元のフレームに直接構築することによって、 のスタック フレームに構築されます。

参照にバインドされると、一時的なものは参照の間存続します。事実上、一時変数は、同じスコープを持つ名前付き変数とまったく同じ方法で管理されます。

于 2014-12-04T14:56:48.713 に答える