指针与下标访问数组的速度问题
作者:Hily 原始链接:http://hily.me/blog/2006/02/pointer-array-index-speed/
版权声明:可以转载,转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
在一本书上写着用指针访问会比用下标访问快,当时没深入研究。后来在网上看到一篇关于堆栈的文章中写着用下标访问比用指针访问快。由此起疑,特地研究了一下。
其实不管是书上写的还是网上文章中写的都没有错,只是针对不同的场合。还是举几个例子比较直观:
1). 定义一个数组a[n],那么可以用a[i]和*(a+i)来访问数组元素;
2). 声明一个指向一个合法空间的指针p,那么可以用p[i]和*(p+i)来访问数组元素;
3). 定义一个数组a[n],将指针p指向a,即p=a,那么可以用a[i]和*(p+1)来访问。
对于前面两种情况,访问速度几乎没有差别。只有在访问第一个元素,即a[0]和*a或p[0]和*p时会有略微区别:以下标访问时总是要在基址上加上一个偏移量,即基址+i*sizeof(type),当i=0时,也要进行此运算;而此时用指针访问时就少了一个加法的运算,速度会比用下标访问快,这就是书上所陈述的(可惜书上没有指出这仅是在访问第一个元素时有区别)。在访问其它元素时(i>=1),不论是用指针还是下标访问,都要进行基址+i*sizeof(type)的运算,速度上就没有差别了。
现在来看看第三种情况,这就是我在网上那篇文章中看到的情况,此时用下标访问要比用指针访问快。因为a本身已经是基址,是个常量;而p是个变量,在取基址时还要经过一步访问变量的过程,以取出其中存储着的基址值。两种方式对应的汇编代码如下:
下标访问:
mov cl,byte ptr [ebp-0Fh]
mov byte ptr [ebp-4],cl
指针访问:
mov edx,dword ptr [ebp-14h]
mov al,byte ptr [edx+1]
mov byte ptr [ebp-4],al
-- EOF --
相关文章:

