【发布时间】:2012-11-13 11:46:39
【问题描述】:
假设我有一个带有复制构造函数和移动构造函数的对象 'foo',以及一个函数
foo f() {
foo bar;
/* do some work */
return bar;
}
标准似乎声明编译器将尝试执行以下操作:NRVO,按右值返回 ref,按值返回,失败;按这个顺序。
有什么方法可以强制编译器永远不按值返回,因为我的复制构造函数非常昂贵?
【问题讨论】:
-
您是否分析并确定存在实际瓶颈?
-
标准定义了NRVO?给我的消息...
-
(我承认它允许 NRVO)
-
它“允许”NRVO,并“允许”通过右值引用返回,但似乎也不需要,除非它们确实发生了优先级。本质上,我想要求其中任何一种发生,但绝不是某些任意函数 foo f(); 中的复制构造函数;
-
f()总是按值返回,从不返回右值引用。 NRVO 表示bar构造在适当的位置以获取返回值。如果 bar 是可移动的,那么如果 NRVO 不能完成,则返回值是从 bar 构造的移动。这似乎是您所说的“按 r 值 ref 返回”的意思,但这不是一个准确的描述。如果它不能移动,那么它是复制构造的。这似乎就是您所说的“按价值回报”的意思,但这也不准确。同样f()总是按值返回,返回值如何构造的内部细节不会改变这一点。
标签: c++ c++11 rvalue-reference move-constructor return-value-optimization