当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++理解RVO(与返回局部变量引用相比)》经验,为你挑选了1个好方法。

这是我使用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更好吗?

非常感谢,



1> Richard Hodg..:

返回整数时,您不会看到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(); 
}

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有