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远远不够好,无法准确地理解这里发生的事情。

性能和意义与您的情况相似

差别很大

  • “可读性”:

    我们不看
    someFunction
    declaration就知道
    bar
    已经构建,不是引用/别名。因此,其他不相关的函数不能更改
    bar
    ,但可以间接更改
    rBar

    (指向

  • 未来变化的行为:

    如果函数更改为返回(const)引用,
    bar
    将复制,而
    rBar
    不会复制。
    (指向
    rBar

我想知道这些参考文献是否有显著的区别

没有

第一种方法只是初始化一个对象变量

第二个初始化临时对象并将该对象绑定到引用。临时变量的生存期延长到引用的生存期(通常临时变量只存在到完整表达式结束)

最后,一旦程序得到优化,就没有任何区别了

其中一个更好吗

对<代码>常量自动条=某些函数(args)

为什么?


因为它更简单,因此更容易理解。作为奖励,它也不太容易写。

在这种情况下,两者的性能应该相同(因为返回值优化)。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