【发布时间】:2019-05-29 04:49:05
【问题描述】:
我了解 RVO 通常是可取的,但如果无法应用会发生什么情况?具体来说,生成的汇编代码如何将本地类/结构实例返回给它的调用者?
MyClass callee() {
MyClass a;
/* RVO is disabled */
return a;
}
void caller() {
/* RVO is disabled */
MyClass b = no_rvo();
}
在这种情况下,堆栈是什么样的? caller()和callee()是否分别在堆栈上为a和b分配空间,然后将a复制到b?如果是这样,callee() 末尾的 RET 语句是否将堆栈指针完全递减到之前的值,还是在复制操作后释放了 a 的堆栈内存?
【问题讨论】:
-
您可以在godbolt.org 上亲自尝试。使用
__attribute__((noinline,noclone)),这样您就可以在启用优化的情况下进行编译,并且仍然可以看到函数调用。如果我能解决这个问题,我可能会在我的答案中添加一个示例。
标签: c++ assembly x86 calling-convention