似乎有关 C++0x 右值的主要建议是将移动构造函数和移动运算符添加到您的类中,直到编译器默认实现它们。
但是,如果您使用 VC10,等待是一种失败的策略,因为自动生成可能要到 VC10 SP1,或者在最坏的情况下,VC11 才会出现。很可能,对此的等待将以年为单位。
这就是我的问题。编写所有这些重复的代码并不好玩。而且看着很不爽。但对于那些被认为速度较慢的课程来说,这是一个很受欢迎的负担。对于数百甚至数千个小班来说,情况并非如此。
::sighs:: 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
没有移动构造函数,性能将受到很大影响。
你怎么看?这个对吗?与减少代码的好处相比,所发生的移动是否是普遍可以接受的损失?