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;
}

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

不幸的是,我的组装能力还远远不够好,无法准确理解这里发生的事情。

最佳答案

I am wondering if there is any significant difference to these being references or not.

没有。

第一个简单地初始化一个对象变量。

第二个初始化一个临时对象并将该对象绑定(bind)到一个引用。临时对象的生命周期延长到引用的生命周期(通常临时对象只存在到完整表达式的末尾)。

最后,一旦程序被优化,就没有任何区别。

Is one of these preferable

是的。 const auto bar = someFunction(args);

why?

因为它更简单,所以更容易理解。作为奖励,写的也少了。

关于c++ - 将引用定义为函数调用 - 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57898338/

相关文章:

c++ - 使用固定数量的整数对 vector 进行排序

c++ - 链表如何实现 O(n log n) 排序时间?

c++ - 未找到 EnterCriticalSection 标识符

c++ - QGraphicsView:蛇线和线动画

c++ - 在哪个访问控制上下文中评估概念?

c++ - DLL 调用 C++ Windows 后出现奇怪的换行问题

c++ - const定义疑惑

c++ - 当我运行此循环以打印字符串中的每个单词时,为什么会丢失一个值?

c++ - ADL,普通查找和依赖函数调用不起作用oO

c++ - 在 QT 中动态创建 GUI,无需在 Visual Studio 中使用表单