猿问

C+11 rvalue和移动语义混淆(返回语句)

C+11 rvalue和移动语义混淆(返回语句)

我试图理解rvalue引用并移动C+11的语义。

这些例子之间有什么区别,它们中的哪一个将不进行向量复制?

第一个例子

std::vector<int> return_vector(void){
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;}std::vector<int> &&rval_ref = return_vector();

第二个例子

std::vector<int>&& return_vector(void){
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);}std::vector<int> &&rval_ref = return_vector();

第三个例子

std::vector<int> return_vector(void){
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);}std::vector<int> &&rval_ref = return_vector();


沧海一幻觉
浏览 426回答 3
3回答

繁华开满天机

第一个例子std::vector<int>&nbsp;return_vector(void){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<int>&nbsp;tmp&nbsp;{1,2,3,4,5}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;tmp;}std::vector<int>&nbsp;&&rval_ref&nbsp;=&nbsp;return_vector();第一个示例返回由rval_ref..它的生命将延长到rval_ref定义,您可以使用它,就像您已经按值捕获了它一样。这与以下内容非常相似:const&nbsp;std::vector<int>&&nbsp;rval_ref&nbsp;=&nbsp;return_vector();但在我重写的时候你显然不能用rval_ref以一种不一致的方式。第二个例子std::vector<int>&&&nbsp;return_vector(void){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<int>&nbsp;tmp&nbsp;{1,2,3,4,5}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::move(tmp);}std::vector<int>&nbsp;&&rval_ref&nbsp;=&nbsp;return_vector();在第二个示例中,您创建了一个运行时错误。rval_ref现在保存对已销毁的tmp在功能里面。如果幸运的话,这个代码会立即崩溃。第三个例子std::vector<int>&nbsp;return_vector(void){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<int>&nbsp;tmp&nbsp;{1,2,3,4,5}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::move(tmp);}std::vector<int>&nbsp;&&rval_ref&nbsp;=&nbsp;return_vector();您的第三个示例大致相当于您的第一个示例。这个std::move在……上面tmp没有必要,而且实际上可能是性能悲观,因为它会抑制返回值优化。编写代码的最佳方法是:最佳做法std::vector<int>&nbsp;return_vector(void){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<int>&nbsp;tmp&nbsp;{1,2,3,4,5}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;tmp;}std::vector<int>&nbsp;rval_ref&nbsp;=&nbsp;return_vector();也就是说,就像在C+03中一样。tmp被隐式处理为返回语句中的rvalue。它将通过返回值优化(不复制,不移动)返回,或者如果编译器决定它不能执行rvo,那么它将使用向量的移动构造函数执行返回..只有在没有执行RVO,并且返回的类型没有移动构造函数的情况下,复制构造函数才会用于返回。

蝴蝶刀刀

他们都不会复制,但第二个将指的是一个被摧毁的向量。命名的rvalue引用几乎不存在于常规代码中。你用C+03编写一个副本。std::vector<int>&nbsp;return_vector(){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<int>&nbsp;tmp&nbsp;{1,2,3,4,5}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;tmp;}std::vector<int>&nbsp;rval_ref&nbsp;=&nbsp;return_vector();除了现在,矢量被移动了。这个用户在绝大多数情况下,类不处理它的rvalue引用。
随时随地看视频慕课网APP
我要回答