2017-02-26 10 views
1

const参照に関する多くの記事を読んだが、探していたものが見つかりませんでした。 一時変数をconst参照にバインドするメカニズムについての私の仮定を修正して、寿命を延ばすことはできますか?一時変数へのconst参照とそのメカニズム

int Foo(){return 3;} 

int main(){ 
const int& ref = Foo(); 
return 0; 
} 

Fooレジスタに位置し、通常はその後棄却され、一時的な無名の値を返します。それをconst参照にバインドすると、コンパイラはそれを却下しないように指示しますが、メモリ内の値をrefのスコープとrefというエイリアスで保存します。

これはどのように動作するのですか?

+0

これらの現代では、特に強力な最適化で通常コンパイルされるC++のような言語について言及するとき、レジスタと「メモリ」について言及するのは、これらの現代における過度の単純化です。あなたがソースに何かを見ているからといって、それが存在する必要があること、またはあなたが期待するかもしれない場所に存在する必要があることを意味するものではありません。たとえば、コンパイル時に 'int main(){return 0;}'に相当するコードを記述します。 '3'は決してどこにも格納されません。 –

答えて

0

実際にどのように実装すればよいのかは言いませんが、可能な方法を示します。

理論的には、コンパイラが一時的なレジスタを保持しておらず、その名前としてrefを使用することはありません。だから、には、に値を記憶させる必要はありません。

または、この特定のケースでは、値が常に3であることがコンパイラによってわかるため、refのすべての用途を3に置き換えることができます。

1

Fooのは、一時的な無名の値に

正しいを返します。標準によって指定されていないレジスタ

に位置し

と通常より正確には、その後

完全な式の終わりに破壊棄却しました。生涯が参照で拡張されていない場合、それはです。

もちろん、整数はデストラクタを持たないので、その存続期間は単に記憶装置があればそれを再使用できるかどうかを示します。 const参照にバインド

はそれを却下するが、REF

正しいの範囲でメモリに値を保存しないようにコンパイラに指示します。一時的に参照をバインドすると、その一時的な有効期間が延長され、参照の有効期間に一致します。

関連する問題