You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC C++11/14中带括号return语句的RVO行为差异问询

带括号return表达式的返回值优化(RVO)编译器差异观察

最近我在测试不同版本编译器对返回值优化(RVO)的处理时,发现了一个有意思的差异,具体情况如下:

GCC 5.4/7.3的行为差异

当return语句的表达式带有括号时,是否触发RVO完全取决于编译时指定的C++标准:

  • 使用-std=c++11编译时,不会触发RVO,会调用拷贝或移动构造函数
  • 使用-std=c++14或-std=c++1z编译时,正常触发RVO,能避免不必要的拷贝/移动操作

Clang的一致行为

不管指定的是-std=c++11还是更高版本的C++标准,Clang都会对带括号的return表达式触发RVO,不会调用拷贝或移动构造函数。

测试代码示例

#include <iostream>

class C {
public:
    C(){ std::cout << "ctor" << std::endl; }
    C(C const &){ std::cout << "copy ctor" << std::endl; }
    C(C &&){ std::cout << "move ctor" << std::endl; }
    ~C(){ std::cout << "dtor" << std::endl; }
};

C func() {
    return (C{}); // 带括号的return表达式
}

int main() {
    C obj = func();
    return 0;
}

简单测试结果说明

  • GCC 7.3下,用-std=c++11编译运行,输出会包含copy ctor或move ctor;切换到-std=c++14后,输出仅保留ctor和dtor,说明RVO生效
  • Clang编译时,无论指定哪个C++标准,输出都只有ctor和dtor,RVO始终生效

内容的提问来源于stack exchange,提问作者lapk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:11:25