2

例子:

A myfunction() { return A(); }
A a = myfunction(); // default ctor only (return value optimization)
a = myfunction(); // default ctor and operator=

为什么编译器不能直接将新对象写入现有对象?我相信一个类的所有实例都占用相同数量的(非动态)内存,所以我不明白为什么这会是一个问题。

4

2 回答 2

6

RVO 发生只是因为 C++ 标准为编译器提供了一个特殊的许可,可以忽略复制构造函数和临时析构函数中的副作用,一旦应用优化就不会发生这种情况。

没有这样的特殊许可可以忽略赋值运算符中的副作用,因此不能省略。此外,由于a在分配之前是有效的,因此首先必须将其销毁,以便可以就地构造新对象。不仅没有特殊的许可证可以忽略这个析构函数调用引入的副作用,更糟糕的是销毁必须在函数调用之前发生,如果函数抛出,你会在哪里?

于 2013-11-27T18:19:43.367 回答
5

RVO 通过在调用者的堆栈帧上构造返回值来工作。

在第一种情况下,它可以直接在存储中构造 for a,因为那里还没有对象。

在第二种情况下,那里已经有一个对象,因此必须先在其他地方构造它,然后再分配给a. 您不能在 之上构造新对象a,因为这不是赋值的工作方式。

于 2013-11-27T18:19:02.743 回答