为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
沧海一幻觉 2019-06-24 13:43:24
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();
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

第一个例子

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

第一个示例返回由rval_ref..它的生命将延长到rval_ref定义,您可以使用它,就像您已经按值捕获了它一样。这与以下内容非常相似:

const std::vector<int>& rval_ref = return_vector();

但在我重写的时候你显然不能用rval_ref以一种不一致的方式。

第二个例子

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();

在第二个示例中,您创建了一个运行时错误。rval_ref现在保存对已销毁的tmp在功能里面。如果幸运的话,这个代码会立即崩溃。

第三个例子

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::move在……上面tmp没有必要,而且实际上可能是性能悲观,因为它会抑制返回值优化。

编写代码的最佳方法是:

最佳做法

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

也就是说,就像在C+03中一样。tmp被隐式处理为返回语句中的rvalue。它将通过返回值优化(不复制,不移动)返回,或者如果编译器决定它不能执行rvo,那么它将使用向量的移动构造函数执行返回..只有在没有执行RVO,并且返回的类型没有移动构造函数的情况下,复制构造函数才会用于返回。


查看完整回答
反对 回复 2019-06-24
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

他们都不会复制,但第二个将指的是一个被摧毁的向量。命名的rvalue引用几乎不存在于常规代码中。你用C+03编写一个副本。

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

除了现在,矢量被移动了。这个用户在绝大多数情况下,类不处理它的rvalue引用。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 425 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信