什么是C++11中的移动语义(move semantics)以及为什么需要它?
你好!我刚开始学习C++11,遇到了术语“move semantics”。我大致理解这与性能有关,但在实践中无法弄清楚。
假设我有这样一个类:
```cpp
class MyString {
public:
MyString(const char* str) : data_(new char[strlen(str) + 1]) { strcpy(data_, str); }
~MyString() { delete[] data_; }
MyString(const MyString& other) : data_(new char[strlen(other.data_) + 1]) { strcpy(data_, other.data_); }
char* data_;
};
```
我写了一个返回 `MyString` 的函数:
```cpp
MyString createHello() {
MyString s("Hello, World!");
return s; // 这里发生了什么?复制?
}
```
使用旧的C++03,在从函数返回时会调用拷贝构造函数,它会分配新内存并复制数据。这很昂贵。但我听说在C++11中可以通过某种方式“移动”数据以避免复制。这是如何工作的?什么是rvalue引用和std::move?何时使用它们?