指针间接对效率有多大影响?

use*_*369 7 c++ pointers

解除引用指针的速度要比直接访问该值慢吗?我想我的问题是 - deference运算符有多快?

Zan*_*ynx 21

由于现代CPU的工作原理,通过指针间接可能要慢得多.但它与运行时内存没什么关系.

相反,速度受预测和缓存的影响.

当指针未被改变或以可预测的方式改变时(例如,在循环中递增或递减4),预测很容易.这允许CPU基本上在实际代码执行之前运行,找出指针值将是什么,并将该地址加载到缓存中.当指针值由像哈希函数这样的复杂表达式构建时,预测变得不可能.

缓存开始起作用,因为指针可能指向不在缓存中的内存,并且必须获取它.如果预测有效,则最小化,但如果预测不可能,那么在最坏的情况下,您可能会产生双重影响:指针不在缓存中,指针目标也不在缓存中.在最糟糕的情况下,CPU将停止两次.

如果指针用于函数指针,则CPU的分支预测器开始起作用.在C++虚拟表中,函数值都是常量,预测器很容易.当执行通过间接跳转时,CPU将准备好运行代码并在管道中运行.但是,如果它是一个不可预测的函数指针,性能影响可能会很大,因为需要刷新管道,每次跳转会浪费20-40个CPU周期.

  • 如果缓冲区足够小以适应高速缓存,则无论它们是否可预测,内存访问都将非常快. (2认同)