右值引用、复制和移动
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)
用于第二个。我知道这是一个非常人为的代码结构,但我可以想象,有真实的用例。以上是关于右值引用、复制和移动的主要内容,如果未能解决你的问题,请参考以下文章