我正在从函数返回非命名对象。为什么 RVO 仍然在发挥作用?
I'm returning non-named object from a function. Why RVO still kicks in?
关于这个:为什么std::move阻止RVO? 有人写道:"因此,在返回语句中,只有在表达式是局部变量的名称时,才会发生复制省略"
但是,我用GCC做了一些测试:
class X
{
public:
X()
{
cout << "def" << endl;
}
X(const X& x)
{
cout << "copy" << endl;
}
X(X&& x)
{
cout << "move" << endl;
}
};
X produceX()
{
return X();
}
int main()
{
X x{produceX()};
return 0;
}
produceX 函数不返回命名值。它返回一个未命名的临时对象。然而,RVO仍然踢,没有复制或移动结构。来自 main 的 x 对象是就地构造的。如果我这样写 produceX:
X produceX()
{
X localNamedObject;
return localNamedObject;
}
它的行为方式相同(这是预期的)。但是为什么在前一种情况下允许RVO?
这种说法过于简单化,尽管你从中得到的答案实际上回答了这个问题,并提供了标准中的相关文本。
在返回临时变量(作为使用临时初始化相同类型的对象的一般情况)以及返回局部变量时,允许复制省略。
在按值抛出和捕获异常时也允许这样做,但这超出了本问题的范围。
RVO 代表"返回值优化",是指直接在返回值空间内构造返回表达式结果的技术。当返回表达式为右值时,将应用它。
NRVO 代表"命名返回值优化",指的是构造最终将直接在返回值空间内返回的命名对象的技术。当返回表达式为左值时,将应用它。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当 RVO 可以应用时,为什么要按shared_ptr而不是按值返回?
- 为什么结构化绑定禁用RVO和移动返回语句
- 为什么不执行"partial RVO"?
- 为什么分配操作员没有发生 RVO?(C++)
- 为什么 C++ 在返回本地 std::stringstream 时不使用 RVO?
- 为什么不总是应用 RVO / NRVO?
- 为什么 std::move 会阻止 RVO(返回值优化)
- 我正在从函数返回非命名对象。为什么 RVO 仍然在发挥作用?
- 为什么标准没有规定RVO和NRVO是强制性的
- 为什么在返回参数时不允许RVO
- 为什么g++在这里不启用RVO
- 为什么Visual Studio在这种情况下不执行返回值优化(RVO)
- 为什么RVO不能与move构造函数一起工作
- 为什么 RVO 不在这里发生?
- 为什么不在此代码中应用 RVO