【发布时间】:2015-08-20 14:13:27
【问题描述】:
我想用右值构造一个对象。
class BigDataClass{
public:
BigDataClass(); //some default BigData
BigDataClass(BigDataClass&& anotherBigData);
private:
BigDataClass(BigDataClass& anotherBigData);
BigDataPtr m_data;
};
所以现在我想做这样的事情:
BigDataClass someData;
BigDataClass anotherData(std::move(someData));
所以现在 anotherData 得到 rValue。事实上,它是一个过期值,所以 http://en.cppreference.com/w/cpp/utility/move 现在声明编译器 有机会通过移动优化 anotherData 的初始化 someData 到另一个。
在我看来,我们实际上可以得到 2 个不同的东西:
- 优化方法:数据移动。它经过优化,速度很快,我们很高兴
- 未优化的方法:未移动数据。我们必须将数据从对象复制到另一个对象并从第一个对象中删除数据(据我所知,一旦我们无法使用它,将对象更改为右值,因为它没有数据所有权,它持有)。事实上,由于删除操作,它甚至比使用左值引用的初始化还要慢。
我们真的可以得到如此未优化的数据初始化方式吗?
【问题讨论】:
-
如果新对象应该获得所有权,那么通常没有什么可以为旧对象释放(它的指针应该被清空)——唯一的开销是执行解构函数
-
我不明白“可以得到 2 种不同的东西”部分。你写课程,你决定。如果你不优化移动,而是复制每个成员,那么你创建了一个合法但低效的“移动”构造函数。规则只说移动构造函数必须使源处于可破坏状态;因此,保持源不变是有效的。
-
那是我弄错了
标签: c++ c++11 optimization rvalue