假设我们有一个接受参数的函数,该参数将仅用于读取。现在,我们不想复制传入的参数,而只是想移动它(出于效率考虑)。
将其作为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
答案 0 :(得分:0)
使用第一个。
第二个只能接受“临时工”。