右值保证了什么样的优化?

What kind of optimizations does rvalue guarantee?

我想用右值构造一个对象。

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 现在编译器声明 有机会通过移动优化另一个数据的初始化 一些数据到另一个。

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

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

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

你说:

So now anotherData gets rValue. It's an eXpiring Value in fact, so as http://en.cppreference.com/w/cpp/utility/move states compiler now has an oppourtunity to optimize the initialization of anotherData with moving someData to another.

其实上面写的是:

Code that receives such an xvalue has the opportunity to optimize away unnecessary overhead by moving data out of the argument, leaving it in a valid but unspecified state.

也就是说,这里负责优化的是代码,而不是编译器。 std::move(someData) 所做的只是将其参数转换为右值引用。考虑到 BigDataClass 有一个接受右值引用的构造函数,该构造函数是首选,而构造函数 被调用。从编译器的角度来看,这里没有任何更改的余地。因此,代码将执行 BigDataClass(BigDataClass&&) 构造函数所做的任何事情。

看来您对什么是优化而什么不是优化感到困惑。使用移动构造函数(如果可用)不是优化,它是标准强制要求的。不是编译器有这个机会,它不得不这样做。 另一方面,复制省略是编译器有机会执行的优化。它有多可靠,取决于你的编译器(尽管他们非常均匀地应用它)和实际的功能代码。

你想想优化器可以用移动语义做什么。简直什么都不是!作为编码人员,您必须实现与具有 const ref 的构造函数相比优化的代码。

问题可以反过来: 如果编译器已经知道您有一个右值作为 const ref 传递给构造函数,则编译器能够进行构造,就好像该值是在构造函数本身中生成的一样。复制消除经常由最新的编译器完成。这里的问题是(对我来说)我应该花多少精力来编写一些右值引用结构以获得与编译器已经为我动态构建的结果相同的结果。

好的,在 c++11 中,您有很多机会通过算法处理转发和移动代码。是的,可以产生一些好处。但是我只看到模板代码的好处,我需要 move/forward 一些参数到(元)模板函数。

相反:必须小心处理右值引用,并且有效但未定义状态的含义会给使用您的接口实现的每个用户带来一些问题。另见:What can I do with a moved-from object?

What kind of optimizations does rvalue guarantee

什么都没有。你必须实施它!