【发布时间】:2015-10-25 22:07:37
【问题描述】:
(N)RVO 有助于在将返回值分配给新变量时避免不必要的复制和创建临时对象(从而避免复制构造函数)。
所以这样的事情应该由 RVO 优化:
MyObj getMyObj() {
return MyObj();
}
MyObj myobj = getMyObj();
但是,调用站点对象已经存在时也会发生这种情况吗? (即在使用 = 运算符而不是复制构造函数的情况下)。我试图找到有关此的文献,但 (N)RVO 似乎总是以避免复制构造函数来描述。不确定在这种情况下修改调用站点对象是否真的安全。
MyObj myobj;
//will getMyObj() first create a temporary object and then copy it via the = operator?
myobj = getMyObj();
【问题讨论】:
-
抛开标准不谈,如果不调用分配
operator,第二个示例怎么可能工作? (我假设您的程序可以观察到创建和赋值之间的myobj状态。)编译器可以首先运行析构函数,然后就地构造一个new对象。但是,这怎么会比使用分配operator更有效呢? (正如 Steve Jessop 所解释的那样,它也不是异常安全的。) -
@5gon12eder 由于您提到的原因,我很确定它不会这样做。但是我不确定在底层是否有其他一些神奇的机制可以检测到函数不能中途停止(它不会抛出)并通过引用隐式传递调用站点变量,以便函数直接更新它。