编译器能优化从拷贝到引用的返回值吗?
Can compiler optimize return value from copy to a reference?
如果我这样写代码:
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&
到存储在类中的值。但是这将是一个不同的函数,你创建,而不是编译器允许为你创建的。
相关文章:
- 将值分配给从函数返回的右值引用
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 将返回类型专用化为 void 或 const 左值引用
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 可以返回右值引用吗?
- 普通的右值引用和 std::forward 返回的引用有什么区别?
- 我可以从取消引用"new"的返回值初始化引用吗
- C++ std::map 的返回值引用
- 按值与右值引用返回
- 为什么我不能将常量左值引用绑定到返回 T&&&的函数?
- 通过引用将函数传递给 TBB 任务时无法返回值
- 了解返回时的右值引用
- 为什么作为返回类型的右值引用不能初始化非常量引用?
- 这安全吗?右值和引用返回值
- 如果函数的返回值将用作右值引用而不是左值,有没有办法使函数具有不同的行为?
- 动态指针引用数组由三元运算符返回值,但有异常
- std::move 返回值 weak_ptr::锁定弄乱了shared_ptr的引用计数?
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- 返回值(引用、指针和对象)
- 从函数返回值:引用vs结构