我对编译器和链接器如何处理函数调用者的要求因函数使用RVO或NRVO而不同感到困惑。
也许这是我的误解,但我的假设是通常情况下没有RVO或NRVO,
std::string s = get_string();
涉及将s从get_string的结果中移动构造,如果get_string不执行N?RVO,则如果get_string执行N?RVO,则调用代码不执行任何操作,并且
s
由函数get_string就地构造。编辑: 以下是如果没有N?RVO,我认为get_string调用程序的操作方式:
1. 调用get_string() 2. get_string结果现在在堆栈上,调用程序使用它来构建s
现在使用RVO:
1. 调用get_string() 2. 当get_string完成时,堆栈上没有结果,get_string构造了s,调用方不需要做任何事情来构造s。