【发布时间】:2018-08-03 22:48:09
【问题描述】:
我很困惑编译器和链接器如何处理函数调用er的要求因函数使用 RVO 还是 NRVO 而异。
这可能是我的误解,但我的假设是通常没有 RVO 或 NRVO
std::string s = get_string();
如果 get_string 不执行 N?RVO 但如果 get_string 执行 N?RVO 调用代码不执行任何操作并且 s 由函数 get_string 就地构造,则涉及从 get_string 的结果移动构造。
编辑: 如果没有 N?RVO,我想象 get_string 调用者的操作方式如下:
- 调用 get_string()
- get_string 结果现在在堆栈上,调用者使用它来构造 s
现在有了 RVO
- 调用 get_string()
- get_string 完成后栈上没有结果,get_string 构造了s,调用者不需要做任何事情来构造s。
【问题讨论】:
-
不是真的,我知道 RVO 从概念上讲是做什么的。我想知道它是如何在 ABI 中实现的,因为调用者需要知道被调用者是如何实现的(或者我错了吗?)。
-
我不确定它与任何其他呼叫有何不同。它是堆栈,因此链接器不在乎。编译器只是将变量一个接一个地放在堆栈上。然后,所有变量访问都是来自当前堆栈顶部的反向引用。 在调用之前创建的变量会稍微往下一点。
-
@Galik - 编辑问题