1. 函数返回机制
函数返回值的传递分为两种情况:
- 当返回的对象大小不超过8字节时,通过寄存器(eax edx)返回。
- 当返回的对象大小大于8字节时,通过栈返回。此处需要注意的时候,如果返回的是struct或者class对象,即使其大小不大于8字节,也是通过栈返回的。
在通过栈返回的时候,栈上会有一块空间来保存函数的返回值。当函数结束的时候,会把要返回的对象拷贝到这块区域,对于内置类型是直接拷贝,类类型的话是调用拷贝构造函数
。这块区域又称为函数返回的临时对象
。
2. 编译器禁止优化
编译器提供了个编译选项-fno-elide-constructors
来禁用返回值优化。
当一个函数返回一个对象实例的时候,理论上会产生临时变量,那必然会导致新对象的构造和旧对象的析构,这对性能是有影响的。C++标准允许省略拷贝构造函数
。简单来说,就是在调用的地方,将需要初始化对象的引用作为函数参数
传递给函数,进而避免不必要的拷贝。
编译器对函数返回值优化的方式分为RVO和NRVO(自c++11开始引入),在后面的文章中,我们将对该两种方式进行详细分析。
标签:返回,函数,对象,C++,编译器,返回值,拷贝,优化 From: https://www.cnblogs.com/love-9/p/18083814