C++ std::move doesn't move anything: A deep dive into Value Categories
4 months ago
- #Move Semantics
- #Performance Optimization
- #C++
- std::move实际上并不移动任何数据,它只是一个将表达式值类别转换为xvalue(将亡值)的类型转换操作。
- 移动构造函数和移动赋值运算符必须标记为noexcept,以确保标准容器在重新分配时使用它们而不是回退到复制操作。
- 通过名称返回局部变量会启用NRVO(命名返回值优化),这比在返回语句中显式使用std::move更高效。
- 从const对象移动会静默回退为复制,因为const对象不可修改,而移动资源需要修改操作。
- 对象被移动后处于『有效但未指定状态』,只应被重新赋值或销毁。
- 五法则:如果实现了析构函数、拷贝构造函数、拷贝赋值、移动构造函数或移动赋值中的任何一个,通常需要实现全部五个。
- std::forward用于模板中的完美转发,保留参数的原始值类别(左值或右值)。
- 短字符串优化(SSO)意味着移动小字符串可能仍涉及复制其内联缓冲区,而非仅交换指针。
- 继承场景中,派生类移动构造函数需要显式std::move基类子对象,因为具名的右值引用会被视为左值。
- C++17强制要求对纯右值进行拷贝省略,保证返回临时对象时无需任何移动或拷贝操作即可高效实现。