使用指向数组元素的指针要比通过索引访问元素慢吗?

时间:2015-09-08 10:03:09

标签: c performance

假设我有一个数组:

app.listen(8001);

我设置了一个指向数组的指针:

mytype_t array[1000];

假设CPU缓存中已存在mytype_t * pointer = &array[317];(及环绕声),解除引用指针的成本与通过索引取消引用数组的成本完全相同吗?

在什么情况下,如果有的话,指针会变慢吗?

编辑根据FUZxxl& Olaf的要求,正在考虑的主要架构是英特尔桌面架构和ARM,但未来可能还有其他架构(游戏平台,如索尼的CBEA,IBM Broadway for Wii) ;编译器是GCC 5.1.0。

1 个答案:

答案 0 :(得分:2)

这可能不会有所作为。

在表达式*pointerarray[317]中,取消引用相同的地址。地址计算通常在仅为此目的而在CPU中留出的ALU中完成,并且成本不高,尤其是(在x86上)当数组中的对象大小是1,2,4或8字节之一或者当指数是不变的。

此外,编译器可能实际上不会生成pointer,而是在每次取消引用pointer时决定重新计算存储在其中的地址,因为这样做可以节省编译器的成本为pointer分配额外的寄存器。

我所知道的基于寄存器内容的推测性预取数据没有任何处理器,但未来可能会有一些,但如果情况确实如此,编译器肯定会优化你的代码。