C ++:在函数的参数上下文中,`const T&`和`T &&`有什么区别?

时间:2019-09-12 19:48:23

标签: c++ reference rvalue

假设我们有一个接受参数的函数,该参数将仅用于读取。现在,我们不想复制传入的参数,而只是想移动它(出于效率考虑)。

将其作为const T &T &&传递是否有区别?并且应该使用。

这是一个例子


void    printRange(const int & start, const int & stop)
{
    for ( int i = start; i < stop; ++i)
        std::cout << i << std::endl;
}

/*                      VS                              */

void    printRange(int && start, int && stop)
{
    for ( int i = start; i < stop; ++i)
        std::cout << i << std::endl;
}

有区别吗?它是什么?还有什么更好的选择?


在这里取整数作为值将是方法:

“因为当您按值取值时,它们是局部变量。 引用可以引用全局可变变量,因此从技术上讲,开始和结束可以在任何函数调用内更改。因此,编译器无法消除负载,必须每次都取消引用变量。 例如:godbolt disection of code

如您所见,在标签.L3(这是循环)的后面,您可以看到cmp DWORD PTR [rbp+0]ebx。这是指针取消引用的负载。在值版本中,两个int都直接位于寄存器中。

此外,在传递引用时,您实际上也在传递指针。该指针是8个字节。因此,您要传递16个字节的参数值。另一方面,简单的整数是4个字节。从值上传递一个int值,即使不进行优化也从技术上来说比较轻。

读这篇,这也是good explanation by a university professor… 而且...还有别名。如果这些int是通过引用提供的,则它们可以彼此互为别名,因此对于优化器来说也更加困难 我认为就这些。也许还有其他我不知道的因素。”

-@ GuillaumeRacicot

1 个答案:

答案 0 :(得分:0)

使用第一个。

第二个只能接受“临时工”。