这是我使用C ++并进行学习的第一年。我目前正在阅读“返回值优化”(我使用C ++ 11 btw)。例如在这里https://en.wikipedia.org/wiki/Return_value_optimization,立即想到这些具有原始类型的初学者示例:
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?)
现在,我开始尝试根据另外两个方面来理解它:
Simpleclass func1() { return Simpleclass(); }
这里实际发生了什么?编辑:我知道大多数编译器将优化此,我问的不是'if',而是:
优化的工作方式(可接受的响应)
它是否会影响存储时间:堆栈/堆(旧:我是从堆栈复制还是在堆上创建并移动(通过引用)基本上是随机的吗?这取决于创建的对象大小吗?)
使用显式std :: move更好吗?
非常感谢,
返回整数时,您不会看到RVO的任何影响。
但是,当返回这样的大对象时:
struct Huge { ... }; Huge makeHuge() { Huge h { x, y, x }; h.doSomething(); return h; }
以下代码...
auto h = makeHuge();
...在RVO之后将被实现如下(伪代码)...
h_storage = allocate_from_stack(sizeof(Huge)); makeHuge(addressof(h_storage)); auto& h = *properly_aligned(h_storage);
...并且makeHuge会编译成这样的东西...
void makeHuge(Huge* h_storage) // in fact this address an be // inferred from the stack pointer // (or just 'known' when inlining). { phuge = operator (h_storage) new Huge(x, y, z); phuge->doSomething(); }