右值引用有什么作用?
右值引用是C++11中引入的一个新特性,主要用于支持移动语义和完美转发。
- 移动语义:对于一些资源消耗类型的对象(如大型数组或者是使用了大量内存的对象),拷贝构造可能非常昂贵。在这种情况下,如果我们明确知道某个对象不会再被使用,我们可以简单地“移动”其内部资源到新对象,而不是创建一个完全新的拷贝。这可以通过使用右值引用实现,提高程序的性能。
-
完美转发:右值引用也可以用来实现函数模板中的完美转发,保持函数参数的原始类型(包括它是左值还是右值)。这是通过使用
std::forward
函数实现的。
以下是一个简单的例子,说明了如何使用右值引用来实现移动构造函数,从而实现移动语义:
#include <iostream>
class BigArray {
int* array;
size_t size;
public:
BigArray(size_t size) : size(size), array(new int[size]) {
std::cout << "Constructed\n";
}
// Move constructor
BigArray(BigArray&& other) noexcept : size(other.size), array(other.array) {
other.size = 0;
other.array = nullptr;
std::cout << "Moved\n";
}
// Copy constructor
BigArray(const BigArray& other) : size(other.size), array(new int[other.size]) {
std::copy(other.array, other.array + other.size, array);
std::cout << "Copied\n";
}
~BigArray() {
delete[] array;
}
};
BigArray createBigArray(size_t size) {
return BigArray(size);
}
int main() {
BigArray ba = createBigArray(1000000); // Moved, not Copied!
return 0;
}
此例中,BigArray
对象通过移动构造函数从 createBigArray
函数移动到 main
函数,而不是通过复制构造函数复制,这使得程序运行更高效。