21

これが以前に尋ねられた場合は申し訳ありませんが、私が理解しているように、C ++ 11にstd::vectorはmoveコンストラクターがあるため、値ごとに返すなど、特定の状況ではコピーのコストはほとんどかかりません。vectorただし、メンバー変数としてaを使用して、このようなクラスがある場合は、次のようになります。

class MyClass {
public:
    MyClass() { }
    MyClass(const MyClass& rhs) { }

    // other interfaces

private:
    std::vector<int> myvec;

    // implementation
};

そして、これらの1つを値で返す関数があります。

MyClass somefunc() {
    MyClass mc;
    // fill mc.myvec with thousands (maybe even millions) of ints
    return mc;
}

のmoveコンストラクターmc.myvecが呼び出され、のmoveコンストラクターは、それ自体がmoveコンストラクターについて何も知らなくてもstd::vector利用されますか?MyClassまたは、のコピーコンストラクターvectorが呼び出され、それらの数千(場合によっては数百万)のすべてintを1つずつコピーする必要がありますか?

4

1 に答える 1

20

明示的なコピーまたは移動コンストラクター、またはコピーまたは移動代入演算子またはデストラクタを記述しない場合、デフォルトで提供されるmove-constructorは要素を1つずつ移動します。詳細については、12.8.9を参照してください。

独自のコピーコンストラクターを定義するため、デフォルトでは移動コンストラクターを取得しません。1つ(おそらく= default)を定義するか、明示的なコピーコンストラクターを削除します。

適切に構成されたクラスは、通常、カスタムBig Fiveを必要とせず、代わりに、それらを提供するメンバーに依存し、デフォルトバージョンを使用します。

于 2011-11-24T04:40:30.750 に答える