Daw*_*dPi 3 c++ optimization rvalue c++11
我想用另一个使用rvalue构造一个对象.
class BigDataClass{
public:
BigDataClass(); //some default BigData
BigDataClass(BigDataClass&& anotherBigData);
private:
BigDataClass(BigDataClass& anotherBigData);
BigDataPtr m_data;
};
Run Code Online (Sandbox Code Playgroud)
所以现在我想做一些事情:
BigDataClass someData;
BigDataClass anotherData(std::move(someData));
Run Code Online (Sandbox Code Playgroud)
所以现在anotherData获得了rValue.事实上,这是一个eXpiring Value,因此http://en.cppreference.com/w/cpp/utility/move状态编译器现在有机会通过将someData移动到另一个来优化anotherData的初始化.
在我看来,我们实际上可以得到两件不同的东西:
我们真的可以获得如此未经优化的数据初始化方式吗?
Cla*_*diu 10
你说:
所以现在anotherData获得了rValue.事实上,这是一个eXpiring Value,因此http://en.cppreference.com/w/cpp/utility/move状态编译器现在有机会通过将someData移动到另一个来优化anotherData的初始化.
实际上,它所说的是:
接收这样的xvalue的代码有机会通过将数据移出参数来优化掉不必要的开销,使其处于有效但未指定的状态.
也就是说,这是负责优化的代码,而不是编译器.所有这些std::move(someData)都是将其参数转换为右值引用.假设BigDataClass有一个带有右值引用的构造函数,那么该构造函数是首选,并且该构造函数将是被调用的构造函数.从编译器的角度来看,这里没有任何改变的余地.因此代码将执行BigDataClass(BigDataClass&&)构造函数所做的任何事情.
看起来你很困惑什么是优化,什么不是.使用移动构造函数(如果可用)不是优化,它是由标准强制执行的.这不是编译器有这个机会,它必须这样做.另一方面,复制省略是编译器有机会执行的优化.它是如何重新定位的,取决于你的编译器(虽然它们非常均匀地应用它)和实际的功能代码.