1

如果我这样写代码:

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

4

1 回答 1

3

不。你要求一个值,所以你得到一个值。复制省略是关于省略不必要的复制。你想要一个价值;该函数返回一个值。因此,您将至少获得一份副本。您想要的是某种形式的代码转换,将值转换为引用。

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

于 2013-04-05T06:31:04.427 回答