假设我有一个数组:
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。
答案 0 :(得分:2)
这可能不会有所作为。
在表达式*pointer
和array[317]
中,取消引用相同的地址。地址计算通常在仅为此目的而在CPU中留出的ALU中完成,并且成本不高,尤其是(在x86上)当数组中的对象大小是1,2,4或8字节之一或者当指数是不变的。
此外,编译器可能实际上不会生成pointer
,而是在每次取消引用pointer
时决定重新计算存储在其中的地址,因为这样做可以节省编译器的成本为pointer
分配额外的寄存器。
我所知道的基于寄存器内容的推测性预取数据没有任何处理器,但未来可能会有一些,但如果情况确实如此,编译器肯定会优化你的代码。