C ++ 0xの右辺値に関する主なアドバイスは、コンパイラーがデフォルトで実装するまで、moveコンストラクターとmove演算子をクラスに追加することです。
ただし、VC10を使用する場合、待機は失われる戦略です。自動生成は、VC10 SP1、または最悪の場合はVC11まではおそらくここにないからです。おそらく、これを待つ時間は数年で測定されます。
ここに私の問題があります。この重複したコードをすべて書くのは楽しいことではありません。そして、見るのは不快です。しかし、これは、遅いと見なされるクラスにとって、好評の負担です。数千とまではいかなくても、数百の小さなクラスではそうではありません。
::ため息::C++ 0xを使用すると、コードの記述量を増やすことはできません。
そして、私は考えました。多くの人が共有していると思います。
すべてを値で渡すだけではどうでしょうか。std :: move + copy elisionはこれをほぼ最適にしませんか?
例1-典型的なPre-0xコンストラクター
OurClass::OurClass(const SomeClass& obj) : obj(obj) {}
SomeClass o;
OurClass(o); // single copy
OurClass(std::move(o)); // single copy
OurClass(SomeClass()); // single copy
短所:右辺値の無駄なコピー。
例2-推奨されるC++0x?
OurClass::OurClass(const SomeClass& obj) : obj(obj) {}
OurClass::OurClass(SomeClass&& obj) : obj(std::move(obj)) {}
SomeClass o;
OurClass(o); // single copy
OurClass(std::move(o)); // zero copies, one move
OurClass(SomeClass()); // zero copies, one move
長所:おそらく最速です。
短所:たくさんのコード!
例3-値渡し+std:: move
OurClass::OurClass(SomeClass obj) : obj(std::move(obj)) {}
SomeClass o;
OurClass(o); // single copy, one move
OurClass(std::move(o)); // zero copies, two moves
OurClass(SomeClass()); // zero copies, one move
長所:追加のコードはありません。
短所:ケース1と2での無駄な移動SomeClass
。移動コンストラクターがないと、パフォーマンスが大幅に低下します。
どう思いますか?これは正しいです?コード削減のメリットと比較した場合、発生した移動は一般的に許容できる損失ですか?