C++ 返回值优化

1. 函数返回机制

函数返回值的传递分为两种情况:

  • 当返回的对象大小不超过8字节时,通过寄存器(eax edx)返回。
  • 当返回的对象大小大于8字节时,通过栈返回。此处需要注意的时候,如果返回的是struct或者class对象,即使其大小不大于8字节,也是通过栈返回的。

在通过栈返回的时候,栈上会有一块空间来保存函数的返回值。当函数结束的时候,会把要返回的对象拷贝到这块区域,对于内置类型是直接拷贝类类型的话是调用拷贝构造函数。这块区域又称为函数返回的临时对象

2. 编译器禁止优化

编译器提供了个编译选项-fno-elide-constructors来禁用返回值优化。

当一个函数返回一个对象实例的时候,理论上会产生临时变量,那必然会导致新对象的构造和旧对象的析构,这对性能是有影响的。C++标准允许省略拷贝构造函数简单来说,就是在调用的地方,将需要初始化对象的引用作为函数参数传递给函数,进而避免不必要的拷贝。

编译器对函数返回值优化的方式分为RVO和NRVO(自c++11开始引入),在后面的文章中,我们将对该两种方式进行详细分析。

posted @ 2024-03-19 19:54  小熊酱  阅读(296)  评论(0)    收藏  举报