0

次のクラスに適したコンストラクターはどれですか?

struct Foo
{ 
  Foo(const int& val):val_(val){} // constructor 1    
  Foo(int val):val_(val){} // constructor 2
  int val_;
};

コンパイラの最適化なしで、val を 1 回だけコピーしますか、それともコンストラクタ 2 が初期化リストの前にさらにコピーを作成しますか?

4

3 に答える 3

2

最初のコンストラクターが呼び出された場合、それに渡された引数はコピーされません引数は、渡されたval引数にバインドされます (参照によるコピー)。

2 番目のコンストラクターが呼び出された場合、それに渡された引数はvalue によってコピーされます

両方のコンストラクターは、それぞれで初期化_valし、値によってval追加のコピーを実行するという点で同じです。

したがって、最適化を行わないと、次のようになります。

                                                    Copies
const int& constructor          1
int constructor                          2
于 2015-11-04T16:48:18.717 に答える
1

基本的に、コンストラクター 2 は 2 回コピーを作成します。1 回目は呼び出し時、2 回目は初期化時です。一方、参照はポインターにすぎず、参照される変数のサイズがポインターのサイズまで減少するため、コンストラクター 1 と 2 の間でコストが削減されないことを理解しています。

于 2015-11-04T16:50:09.983 に答える
1

int一般に、変数を const 参照で渡す必要はありません。

本当の質問は、なぜ気にするのですか? Foo非常に多くの反復伴うループ内で構築された場合にのみ測定可能な速度の違いがあり、それがそのループ内で発生する唯一のことです - 非常にありそうもないです。

したがって、#2を使用してください。効率のためではなく、よりシンプルだからです。

于 2015-11-04T16:57:22.050 に答える