次のクラスに適したコンストラクターはどれですか?
struct Foo
{
Foo(const int& val):val_(val){} // constructor 1
Foo(int val):val_(val){} // constructor 2
int val_;
};
コンパイラの最適化なしで、val を 1 回だけコピーしますか、それともコンストラクタ 2 が初期化リストの前にさらにコピーを作成しますか?
次のクラスに適したコンストラクターはどれですか?
struct Foo
{
Foo(const int& val):val_(val){} // constructor 1
Foo(int val):val_(val){} // constructor 2
int val_;
};
コンパイラの最適化なしで、val を 1 回だけコピーしますか、それともコンストラクタ 2 が初期化リストの前にさらにコピーを作成しますか?
最初のコンストラクターが呼び出された場合、それに渡された引数はコピーされません。引数は、渡されたval
引数にバインドされます (参照によるコピー)。
2 番目のコンストラクターが呼び出された場合、それに渡された引数はvalue によってコピーされます。
両方のコンストラクターは、それぞれで初期化_val
し、値によってval
追加のコピーを実行するという点で同じです。
したがって、最適化を行わないと、次のようになります。
Copies
const int& constructor 1
int constructor 2
基本的に、コンストラクター 2 は 2 回コピーを作成します。1 回目は呼び出し時、2 回目は初期化時です。一方、参照はポインターにすぎず、参照される変数のサイズがポインターのサイズまで減少するため、コンストラクター 1 と 2 の間でコストが削減されないことを理解しています。
int
一般に、変数を const 参照で渡す必要はありません。
本当の質問は、なぜ気にするのですか? Foo
非常に多くの反復を伴うループ内で構築された場合にのみ測定可能な速度の違いがあり、それがそのループ内で発生する唯一のことです - 非常にありそうもないです。
したがって、#2を使用してください。効率のためではなく、よりシンプルだからです。