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