2016-12-15 9 views
1

は、これら二つのconst変数の初期化の違いは、パフォーマンスなど、あらゆる局面では、何ですか?const参照変数の初期化

int foo() 
{ 
    return 1; 
} 

main() 
{ 
    const auto v1 = foo(); 
    const auto &v2 = foo(); 
} 

を考えてみましょうか他のものより優先される状況はありますか?

+0

"早すぎる最適化はすべての悪の根源です" – Slava

+0

@Slavaこのすべての言語はすべてマイクロ最適化に関するものです。 – grisevg

+0

@grisevg私は同意しません。まず、間違ったプログラムの速さは絶対に重要ではありません。読みやすさがまずいので、微視的な描写は必要な場合にのみ行います。 – Slava

答えて

0

const auto v1 = foo()

これにより、const変数v1が作成されます。前述のように、foo()が返すものはv1で保持されます。

CONST自動& V2 = FOO()

のfoo()が参照を返すべきであるので、CONSTへの参照です。 foo()が返すものが、移動セマンティクスをサポートしていない場合は、const & v2がより速くなります。

P.S.あなたの場合、foo()がintを返すので、それは問題ではありません。

+0

私が答えて言うように、この場合、 'const auto&v2 = foo()'は非常に危険で、一時的な長寿命を利用し、それがどのように動作するかをよく理解しない限り、避けるべきです。 – grisevg

+1

constが参照する一時変数は、v2が有効範囲外になるまでは破棄されません。詳細については、これを確認してくださいhttps://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –

-1

私は注意して、一時的な参照を避けるでしょう(リンクhttps://herbsutter.com/2008/01/01/gotw-88-a-c....のA.Nへの名誉)。後で容易に変更できない動作であるauto &v2 = foo();に簡単に変更することができます。

Scott MeyersとHerb Sutterは、値でスタック上に作成されたオブジェクトを返すことを推奨します。名前付き戻り値最適化(NRVO)を使用して最適なパフォーマンスを確保することができます。実際には、一時的な使用または移動のセマンティクスへの参照よりも高速です。

私はconst参照で一時的な生涯を延ばさないと言っているわけではありません。例えば、NRVOができないときには意味があるユースケースがあるかもしれません。正当な理由がない限りそれはありません。これはあまり知られていない機能であり、危険なコードにつながる可能性があります。

UPDATED:const auto &v2 = foo();が実際に有効なコードであることを修正しましたが、まだ避けるべき理由は説明が追加されました。 NRVOを記述するリンクも追加されました。

+0

なぜVS2012はそれに対して警告を発しませんか? – user6386155

+1

コンパイラのどれもがconstだから不平を言うことはありません。これを確認してくださいhttps://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –