C ++理解RVO(与返回局部变量引用相比)

时间:2017-01-14 12:19:53

标签: c++ c++11

这是我使用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?)

这里究竟发生了什么?编辑:我知道大多数编译器会优化这个,我问的不是“如果”但是:

  • 优化的工作原理(接受的响应)
  • 是否会影响存储持续时间:堆栈/堆(旧:无论我是从堆栈复制还是在堆上创建并移动(传递引用),它是否基本上是随机的?它是否依赖于创建的对象大小?
  • 使用显式std :: move?
  • 是不是更好

非常感谢,

1 个答案:

答案 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);