rvalue保证什么样的优化?

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的初始化.

在我看来,我们实际上可以得到两件不同的东西:

  1. 优化方法:数据移动.它经过优化,快速,我们很高兴
  2. 非优化方法:数据未移动.我们必须将数据从对象复制到另一个并从第一个数据中删除数据(据我所知,一旦我们无法使用它,将对象更改为rvalue,因为它没有数据的所有权,它持有).事实上,由于删除操作,它可能比使用左值参考的初始化更慢.

我们真的可以获得如此未经优化的数据初始化方式吗?

Cla*_*diu 10

你说:

所以现在anotherData获得了rValue.事实上,这是一个eXpiring Value,因此http://en.cppreference.com/w/cpp/utility/move状态编译器现在有机会通过将someData移动到另一个来优化anotherData的初始化.

实际上,它所说的是:

接收这样的xvalue的代码有机会通过将数据移出参数来优化掉不必要的开销,使其处于有效但未指定的状态.

也就是说,这是负责优化的代码,而不是编译器.所有这些std::move(someData)都是将其参数转换为右值引用.假设BigDataClass有一个带有右值引用的构造函数,那么该构造函数是首选,并且该构造函数是被调用的构造函数.从编译器的角度来看,这里没有任何改变的余地.因此代码将执行BigDataClass(BigDataClass&&)构造函数所做的任何事情.


Ser*_*eyA 5

看起来你很困惑什么是优化,什么不是.使用移动构造函数(如果可用)不是优化,它是由标准强制执行的.这不是编译器有这个机会,它必须这样做.另一方面,复制省略是编译器有机会执行的优化.它是如何重新定位的,取决于你的编译器(虽然它们非常均匀地应用它)和实际的功能代码.