将引用定义为函数调用 - 有什么好处?
Defining a reference as a function call - what are the benefits?
我遇到了如下所示的代码:
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);
我想知道这些是参考文献是否有任何显着差异。我使用计时器测试了这两个变量的性能,没有发现结果有任何显着差异,并且这两个变量的行为方式似乎完全相同,至少在表面上是这样。
其中之一是否更可取,如果是,为什么?撇开一致性争论不谈。
抱歉,如果标题不清楚,我真的不知道该怎么称呼它。
进一步挖掘
我在Visual Studio 2015(MSVC v140(中检查了这两行的反汇编,发现:
非参考:
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
不幸的是,我的组装傅远不足以准确理解这里发生的事情。
我想知道这些引用是否有任何显着差异。
不。
第一个只是初始化一个对象变量。
第二个初始化一个临时对象,并将该对象绑定到引用。临时的生存期延长至引用的生存期(通常临时项只存在到完整表达式结束(。
最后,一旦程序被优化,就没有任何区别。
是其中之一
是的。const auto bar = someFunction(args);
为什么?
因为它更简单,因此更容易理解。作为奖励,它也较少写。
在您的情况下,性能和含义相似。
区别主要是
-
"可读性":
我们不用看
someFunction
声明就知道bar
已经构造好了,而不是引用/别名。因此,其他不相关的功能不能改变bar
但可以间接改变rBar
。
(指向bar
(。 -
未来更改的行为:
如果函数更改为返回 (const( 引用,
bar
会复制,而rBar
则不这样做rBar
。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 在C++17中,引用const字符串的语义应该是什么
- 引用文件的适当方法是什么?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- 在 Rust 中,指针和引用有什么区别?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 获取通用/前向引用地址有什么意义?
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 普通的右值引用和 std::forward 返回的引用有什么区别?
- 通过引用函数传递指针参数是什么意思?
- C++ 中的引用范围是什么?
- 将引用绑定到指针的语法是什么?(各种)
- constexpr引用有什么用吗
- 对struct::struct的未定义引用是什么意思
- 在 Python 的 C/C++ 扩展中,返回的 PyObject* 应该具有什么引用计数