c++ - 通过引用或指针传递 char 或 short 是否比通过值传递慢?
问题描述
我一直听人说,通过引用而不是值传递(复制)对于大于int
或long long
因为它避免复制的类型更有效。当一个参数按值传递时,该值被推送到在函数中完成操作的堆栈中,但我看到的方式是,当您传递引用或指针时,您传递的是变量的地址。如果是这种情况,CPU是否必须从该地址获取该值,该地址不像堆栈变量那样是本地的,从而导致获取可能不在缓存中的数据?这是否意味着通过引用或指针传递类似char
或较慢的东西?short
我听说它对这些类型没有影响,但如果没有,
解决方案
首先,在几乎所有情况下,“更快”和“更慢”都不能通过某种推理来确定。它只需要针对不同情况测量时间。
说了上面的话,让我们开始追逐。这里有几个要点:
- 无论你做什么,只要不改变程序的可观察行为,编译器就可以自由地改变任何东西。所以从这个角度来看它可能并不重要,因为编译器可以交换(以两种方式)传递
const T&
和传递,T
只要它知道它与语义角度没有区别 - 即使编译器没有更改任何内容,您也可能不会观察到任何影响,因为几乎所有现代处理器都可以很好地使用单级间接(这会导致单汇编指令)。当然,并非每条指令都同样快,但这让您了解这种变化有多么小
- (我认为)通过引用传递时缓存未命中的可能性稍大一些,理论上这会导致更大的性能损失,但我认为内存预取在当前处理器上已经足够复杂,可以在大多数情况下处理这个问题
- 即使您的处理器对这些操作有明显的速度差异,它仍然不如算法复杂性重要,这使得这实际上是一个理论问题,而不是一个实际问题
推荐阅读
- excel - 为范围内的不同重复值分配不同的颜色
- python - 从python中的字典中删除特定项目?
- tensorflow - 如果规定的训练时间超过 12 小时,如何在 Google Colab 的免费 gpu 上训练大型数据集?
- sql - SQL Server 中一张表引用多张表
- javascript - Eloquent JavaScript 第 6 章 Ineratior 接口示例,“this.matrix.get(this.x, this.y)”
- r - Rselenium:down_arrow 在下拉菜单中不起作用
- javascript - 匹配来自 div 的文本然后添加类
- swift - 为什么蒸汽云部署认为我正在运行 swift 3.1.0?如您所见,我正在运行 Swift 5.2
- javascript - reactjs 虚拟化列表
- javascript - 我可以使用“this”从按钮中获取文本吗?