通过引用或指针传递 char 或 short 是否比通过值传递慢?

时间:2021-04-09 09:35:57

标签: c++ c performance

我一直听说,对于大于 intlong long 的类型,通过引用传递而不是值(复制)更有效,因为它避免了复制。当一个参数按值传递时,该值被推送到函数中完成操作的堆栈上,但我看到的方式是,当您传递引用或指针时,您正在传递变量的地址。如果是这种情况,CPU 是否必须从该地址获取该值,该地址不像堆栈变量那样是本地的,从而导致获取可能不在缓存中的数据?这是否意味着通过引用或指针传递诸如 charshort 之类的东西会更慢?我听说它说对于这些类型没有区别,但如果没有,你能解释一下我的推理哪里错了吗?

4 个答案:

答案 0 :(得分:6)

首先,在几乎所有情况下,“更快”和“更慢”都无法通过某种推理来确定。它只需要测量不同情况下的时间。

说了以上,让我们开始追逐吧。这里有几个要点:

  • 无论你做什么,编译器都可以自由地改变任何东西,只要它不改变程序的可观察行为。所以从这个角度来看它可能并不重要,因为编译器可以交换(以两种方式)通过 const T& 和通过 T,只要它知道它从语义角度来看没有区别
  • 即使编译器没有改变任何东西,您也可能不会观察到任何影响,因为几乎所有现代处理器都可以很好地使用单级间接(这会导致单个汇编指令)。当然,并非每条指令都同样快,但这让您了解这种变化有多大
  • (我认为)通过引用传递时缓存未命中的可能性稍大,这在理论上会导致更大的性能损失,但我认为当前处理器上的内存预取足够复杂,可以在大多数情况下处理此问题
  • 即使您的处理器在这些操作上有明显的速度差异,它仍然不如算法复杂性重要,因此这实际上是一个理论问题,而不是实际问题

答案 1 :(得分:1)

是的,是的。但这不会导致大的性能问题。此外,从内存中获取值比复制它慢。同样对于 int、long long 类型,您不应该对它们使用引用。

答案 2 :(得分:1)

根据 StackOverflow @green-lantern 中的旧帖子说:

<块引用>
  • 通过引用传递的开销: 每次访问都需要取消引用,即多读一次内存
  • 传值开销:需要将值复制到堆栈或寄存器中

    对于小对象,例如整数,按值传递会更快。对于较大的对象(例如大型结构),复制会产生过多的开销,因此通过引用传递会更快。

来源:Pass by value faster than pass by reference

让我们快速浏览一下不同类型的尺寸:

  • char - 1 字节
  • 字符指针 - 8 字节
  • 短 - 2 个字节
  • 短指针 - 8 字节

根据经验,如果按值传递的数据量大于指针大小,则按引用或指针传递通常比按值传递快。

在当前情况下,对于 char 和 short 类型,按值传递比按引用传递要快

答案 3 :(得分:-2)

这是一个类比:

Pass by value: Here is the thing.
Pass by reference: You go to this address and you'll find the thing.    

哪个更快*?按值传递。

有关系吗?取决于您的用例,请尝试对其进行测量。

  • 完全取决于 CPU 架构、缓存大小和其他因素。