【发布时间】:2014-11-20 16:52:04
【问题描述】:
我的理解是,要让编译器能够进行命名返回值优化 (NRVO),返回值必须在函数体中的任何其他值之前声明。我怀疑这可能是由于发生异常时堆栈展开的顺序,但我不确定。命名返回值必须是函数体中第一个声明的原因是什么?
class C{};
C f(){
C ret; //NRVO possible
return ret;
}
C g(){
int i;
C ret; //NRVO not possible?
return ret;
}
用例:
auto c = f();
auto c2 = g();
编辑: 感谢所有回答者帮助我理解这一点,我开始怀疑 Chandler Carruth 在此处的声明:http://www.youtube.com/watch?v=fHNmRkzxHWs 分钟 32:30 可能具有误导性和/或我只是误解了它。首先声明返回变量似乎并不重要。
【问题讨论】:
-
可能有 一些 编译器会施加此限制,但总的来说,您的理解是有缺陷的——变量定义顺序不会启用/禁用 NRVO。
-
你测试过这个假设吗?如果是这样,使用哪个编译器?
-
这个outdated link 可能会有所帮助
标签: c++ optimization rvo