C++11 新特性及原理(二、右值引用及移动构造函数)
目录
接上篇C++11 新特性及原理(一、基础篇)文章继续,该篇文章内容较多请读者耐心去品味,定能掌握右值引用及移动构造函数的精髓,在以后的代码开发中将性能提高到极致。
四、右值引用及移动构造函数(提高性能)
1、右值引用及右值的概念
右值:通常是指临时的对象,它们只在当前的语句中有效。
右值引用 (Rvalue Referene) 是 C++11引入的新特性,它是用来支持转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面:
1、消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。
2、能够更简洁明确地定义泛型函数。
有了右值引用后,我们就能对右值进行修改与操作,看下列示例 :
void AddValue(int& i) {
i+=2;
std::cout << "LValue AddValue: " << i << std::endl;
}
void AddValue(int&& i) {
i+=10;
std::cout << "RValue AddValue: " << i << std::endl;
}
void ForwardValue(int&& i) {
AddValue(i);
}
int main() {
int a = 1;
AddValue(a); // LValue AddValue: 3
AddValue(1); // RValue AddValue: 11
ForwardValue(2); // LValue AddValue: 4
}
虽然 2 这个立即数在函数 forward_value 接收时是右值,但到了 process_value 接收时,变成了左值。
2、move语义
左值(引用)可以通过std::move()强制类型转换成右值引用。