据看来,关于C++0x的rvalue的主要建议是在类中添加移动构造函数和移动赋值运算符,直到编译器自动实现它们。
但如果你使用VC10,等待不是一个明智的策略,因为自动生成可能要等到VC10 SP1,或者在最坏情况下,VC11。很可能,等待这一点将需要数年时间。
这就是我的问题所在。编写所有这些重复的代码并不好玩。而且看起来也不舒服。但是对于那些被认为速度慢的类来说,这是一个可承受的负担。但对于数百甚至数千个较小的类来说,情况并非如此。
::叹气:: C++0x本应让我写更少的代码,而不是更多!
然后我想了想。这个想法很多人都有,我猜测。
为什么不只按值传递所有东西呢?std::move + 复制省略不会使这几乎达到最佳状态吗?
示例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
没有移动构造函数,性能将受到严重影响。
你认为呢?以上操作所产生的移动成本相对于减少代码的好处来说是否可以接受?