首页 > 解决方案 > 通过引用或指针传递 char 或 short 是否比通过值传递慢?

问题描述

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

标签: c++cperformance

解决方案


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

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

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

推荐阅读