编译器可以优化从复制到引用的返回值吗?

时间:2013-04-05 06:27:34

标签: c++ optimization concurrency

如果我这样编写代码:

shared_ptr<Foo> Bar::getFoo()
{
    return m_foo;
}

void somewhereElse()
{
    shared_ptr<Foo> foo = myBar.getFoo();
    //do some stuff with foo
}

编译器可以以某种方式优化代码,以便将其更改为:

void somewhereElse()
{
    const shared_ptr<Foo> &foo = myBar.getFoo__by_ref_somehow();
    //do some stuff with foo
}

我问,因为在并发执行的情况下这可能是一个问题。

据我所知,可以应用RVO并删除额外的副本,但编译器是否可以删除副本?

1 个答案:

答案 0 :(得分:3)

没有。您要求输入值,因此获取值。复制省略是为了避免不必要的副本。你想要一个价值;该函数返回一个值。所以你将获得至少一份副本。您想要的是某种形式的代码转换,将值转换为参考。

您可以创建函数getFoo__by_ref_somehow,它会将const&返回给存储在类中的值。但这将是您创建的不同功能,而不是允许编译器为您创建的功能。