编译器能优化从拷贝到引用的返回值吗?

Can compiler optimize return value from copy to a reference?

本文关键字:返回值 引用 优化 拷贝 编译器      更新时间:2023-10-16

如果我这样写代码:

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可以应用并删除额外的副本,但是编译器可以完全消除副本吗?

No。您请求一个值,所以您得到一个值。拷贝删减是指删减不必要的拷贝。你想要一个值;函数返回一个值。所以你至少会得到一份拷贝。您需要的是某种形式的代码转换,将值转换为引用。

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