【发布时间】:2013-12-17 12:50:06
【问题描述】:
编译器如何确定何时对 RVO 是安全的?不,我不是指右值,而是左值——如果我理解正确的话,RVO 通过将目标地址“转发”到方法来工作,所以它返回到目标地址而不是临时地址,然后复制/分配给目标。
但是编译器如何知道执行 RVO 是安全的?如果左值中已经有一些数据,包括动态分配的资源怎么办?在这种情况下,RVO 可能会导致资源泄漏。也许有一些规则指定它是否适用于执行优化或坚持使用复制或分配?
【问题讨论】:
-
RVO 不会导致资源泄露(对于理智的类型)。该对象是在被调用者期望返回值所在的同一位置构造的。确切的规则可能取决于实施,但标准并未强制执行。
-
怎么会导致资源泄露?它的行为就像您将要复制到的变量作为参考参数传递一样
-
如果它是一个“构造函数”类型的函数,它为成员指针分配动态资源,在同一个对象的地址上运行该函数两次将分配资源两次,我假设一个“构造函数类型" 函数将直接分配而不是检查指针是否已经分配。这对于“构造函数类型”函数是有意义的。所以第一个资源会泄露...
-
构造函数为什么会被调用两次?
-
@sftrabbit - 好吧,我明确地将它放在 "" 中,并将其称为“构造函数”类型的函数,而不是构造函数本身。假设 ` T a = foo1(); .... a = foo2()` -
foo1应用 RVO 是安全的,但如果foo2应用它,动态资源将泄漏。
标签: c++ compiler-construction return-value-optimization