C++ 性能优化:移动语义与拷贝省略
移动语义和编译器的拷贝省略(RVO)能显著减少开销。
1. 拷贝省略(RVO/NRVO)
编译器会省略返回值的拷贝,直接构造到目标位置。
struct BigData {
BigData() = default;
BigData(const BigData&) { std::cout << 'Copy' << std::endl; }
BigData(BigData&&) { std::cout << 'Move' << std::endl; }
};
BigData create() {
BigData local;
return local; // 触发 RVO,无拷贝
}
int main() {
BigData obj = create(); // 无输出
}2. 强制移动
std::vector<BigData> vec;
BigData data;
vec.push_back(std::move(data)); // 调用移动构造3. 参数传递建议
- 只读大对象:
const T& - 需要修改或移动:
T&或T&& - 小型类型:值传递
4. noexcept 对移动的影响
移动构造函数标记 noexcept 能让 vector 扩容时使用移动而非拷贝。
class MyClass {
public:
MyClass(MyClass&& other) noexcept { /* ... */ }
};关注拷贝开销是写出高效 C++ 代码的关键。
