右值引用、复制和移动

Posted

技术标签:

【中文标题】右值引用、复制和移动【英文标题】:Rvalue references, copy and move 【发布时间】:2020-08-05 05:51:45 【问题描述】:

考虑以下交换代码部分:

//for some type T
void swap(T& a, T& b) 
    T temp = a;
    a = b;
    b = temp;

下面这个:

//for some type T
void swap(T& a, T& b) 
    T temp = static_cast<T&&>(a);
    a = static_cast<T&&>(b);
    b = static_cast<T&&>(temp);

我有以下疑问: 它们之间有什么区别?我的意思是为什么第一次交换比第二次更贵?

参考:c++编程语言7.7.2

【问题讨论】:

第一个复制三个副本,第二个复制你的移动。一般来说,移动比复制更有效,但显然它确实取决于被移动或复制的对象的类型。 【参考方案1】:

它们之间有什么区别?我的意思是为什么第一次交换比第二次更贵?

第二个为支持它的类型启用移动(即具有移动赋值运算符)。这些类型包括标准向量、字符串等。

对于不支持移动语义的基本类型(int、bool等),没有区别,都是普通的copy。

【讨论】:

这完全正确吗?编译器可以进行任何没有副作用的优化。所以Tp a, b; std::swap(a,b); a.foo(b) 可以优化为Tp a, b; b.foo(a) 用于第二个。我知道这是一个非常人为的代码结构,但我可以想象,有真实的用例。

以上是关于右值引用、复制和移动的主要内容,如果未能解决你的问题,请参考以下文章

[c++11]右值引用移动语义和完美转发

[转][c++11]我理解的右值引用移动语义和完美转发

右值引用,移动语义,完美转发

右值引用,移动语义,完美转发

C++11 ——— 右值引用和移动语义

移动选定的构造函数而不是复制。 [参考标准]