这是我使用C ++和学习的第一年。我正在阅读返回值优化(我使用C ++ 11顺便说一句)。例如。这里https://en.wikipedia.org/wiki/Return_value_optimization,我们会立即想到这些带有原始类型的初学者例子:
Join
......而且这一个:
int& func1()
{
int i = 1;
return i;
}
//error, 'i' was declared with automatic storage (in practice on the stack(?))
//and is undefined by the time function returns
现在,我接受了这个并尝试根据另外两个来理解它:
int func1()
{
int i = 1;
return i;
}
//perfectly fine, 'i' is copied... (to previous stack frame... right?)
这里究竟发生了什么?编辑:我知道大多数编译器会优化这个,我问的不是“如果”但是:
非常感谢,
答案 0 :(得分:5)
返回时,你不会看到RVO的任何影响。
但是,当返回这样的大型对象时:
True
以下代码......
struct Huge { ... };
Huge makeHuge() {
Huge h { x, y, x };
h.doSomething();
return h;
}
......在RVO之后会实现类似这样的内容(伪代码)......
auto h = makeHuge();
...而且makeHuge会编译成这样的东西......
h_storage = allocate_from_stack(sizeof(Huge));
makeHuge(addressof(h_storage));
auto& h = *properly_aligned(h_storage);