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
相关产品推荐
相关产品推荐

