C++ 返回值优化
1. 函数返回机制
函数返回值的传递分为两种情况:
- 当返回的对象大小不超过8字节时,通过寄存器(eax edx)返回。
- 当返回的对象大小大于8字节时,通过栈返回。此处需要注意的时候,如果返回的是struct或者class对象,即使其大小不大于8字节,也是通过栈返回的。
在通过栈返回的时候,栈上会有一块空间来保存函数的返回值。当函数结束的时候,会把要返回的对象拷贝到这块区域,对于内置类型是直接拷贝,类类型的话是调用拷贝构造函数
。这块区域又称为函数返回的临时对象
。
2. 编译器禁止优化
编译器提供了个编译选项-fno-elide-constructors
来禁用返回值优化。
当一个函数返回一个对象实例的时候,理论上会产生临时变量,那必然会导致新对象的构造和旧对象的析构,这对性能是有影响的。C++标准允许省略拷贝构造函数
。简单来说,就是在调用的地方,将需要初始化对象的引用作为函数参数
传递给函数,进而避免不必要的拷贝。
编译器对函数返回值优化的方式分为RVO和NRVO(自c++11开始引入),在后面的文章中,我们将对该两种方式进行详细分析。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」