传递常量引用:性能提高

Passing const reference: performance increase?

本文关键字:性能 引用 常量      更新时间:2023-10-16

之间是否存在任何有价值的性能差异

int myFunction(const int &a) { return 2 + a; }

这个:

int myFunction(int a) { return 2 + a; }

据我所知,第二个方法将作为参数传递的变量复制到一个新寄存器,这需要在asm代码中执行更多指令。这个函数每秒被调用一千次,在这种情况下性能至关重要,传递常量引用而不是变量更好吗?

如果你的编译器看不到这两位代码有相同的效果,那它就是一块垃圾,你不应该使用它。

但你的论点是无稽之谈。以下是两者的天真实现:

1:int myFunction(const int &a) { return 2 + a; }
传递a的地址。从该地址获取值。再加两个。退回。

2:int myFunction(int a) { return 2 + a; }
传递a的值。再加两个。退回。

请注意,第二个操作避免了两个操作——获取a的地址,然后从该地址获取a的值。更糟糕的是,第一个只有在a存储在内存中时才有效,这意味着如果它还没有存储在内存,就必须将其存储在内存。哎哟

一秒钟只打一千个电话,不会有多大区别。但对于编译器可能无法同时查看所有内容的更复杂的情况,标准做法是按值传递"小"类型。只有当额外间接寻址的成本小于复制值的成本时,才希望通过引用传递。

对于小类型,通过值传递它们可能比通过常量引用传递更有效,因为引用增加了间接级别。

对于这里小类型的定义,您应该进行度量,但对于平台的单词大小(例如int、float(左右的值,您最好通过值传递。

通常第二个函数定义比第一个更有效,因为在第一个函数定义中使用了对参数的间接引用。