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