240 字
1 分钟
09RVO和移动构造
2025-02-12

移动构造和编译器的RVO优化#

RVO (Return Value Optimization,返回值优化)

class Test{
public:
int * data = 0;
};
Test func(){
Test t1;
return t1;
}
int main(){
Test t2 = test();
std::cout << "t.data = " << *t.num << std::endl;
return 0;
}

在func()中,直接返回局部对象t1给main()时,编译器会进行RVO优化。

即:直接在func()中的t所在的内存空间上直接构建main()函数中的t2对象。跳过了内存拷贝和创建临时对象带来的开销。

如果使用移动构造,需要先开辟一块内存空间用于存储t2对象,然后再把t1的数据移动到t2中。

  • RVO的特点:在原始内存上构建对象,跳过了构造和析构的步骤,效率更高,内存开销更少。
  • 移动构造的特点:开辟一块内存存放新的对象,通过指针转移数据所有权,减少了数据拷贝的开销。