C++ 将引用定义为函数调用-有什么好处?
我遇到过这样的代码:C++ 将引用定义为函数调用-有什么好处?,c++,C++,我遇到过这样的代码: std::vector<foo> someFunction(Args args) { std::vector<foo> value; /*...*/ return value; } std::vector<foo> someOtherFunction(OtherArgs args) { std::vector<foo> value; /*...*/ return value; }
std::vector<foo> someFunction(Args args)
{
std::vector<foo> value;
/*...*/
return value;
}
std::vector<foo> someOtherFunction(OtherArgs args)
{
std::vector<foo> value;
/*...*/
return value;
}
const auto bar = someFunction(args);
const auto& rBar = someOtherFunction(otherArgs);
不幸的是,我的汇编fu远远不够好,无法准确地理解这里发生的事情。性能和意义与您的情况相似 差别很大
- “可读性”:
我们不看
declaration就知道someFunction
已经构建,不是引用/别名。因此,其他不相关的函数不能更改bar
,但可以间接更改bar
。rBar
(指向
)栏
- 未来变化的行为:
如果函数更改为返回(const)引用,
将复制,而bar
不会复制。rBar
(指向
)rBar
因为它更简单,因此更容易理解。作为奖励,它也不太容易写。在这种情况下,两者的性能应该相同(因为返回值优化)。rBar引用在退出作用域之前是有效的,所以对bar来说真的没有什么不同。理论上,bar可能涉及额外的复制步骤,但对于RVO则不应如此。由于C++17,这些步骤是相同的(除了
decltype(bar)
之后的结果)。您可能会在c++17之前的代码中看到此构造,其中编码人员不信任compiler@M.M因为C++17-如果我使用的是C++14编译器,会有什么不同?在这一点上,这仅仅是一个优化问题吗?
mov edx,20h
lea rcx,[vec]
call std::vector<int, std::allocator<int> >::__autoclassinit2
lea rcx,[vec]
call someFunction
nop
lea rcx[rbp+88h]
call someFunction
nop
lea rax,[rbp+88h]
mov qword ptr [rVec],rax