指针和数组 谁快
谭浩强老师的《C语言程序设计》第二版,page211页,有这样一段话:
引用数组元素可以用下标法,也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。
每次看到这个地方我都有点不解。后来在VC6.0环境下想了个实验办法,编写一个简单的控制台程序,利用反汇编工具察看编译后的代码,发现好像不是这样子的。从下面代码看,好像利用指针访问数组元素要比下标法要慢。
代码如下:
#include <stdio.h>
void main()
{
int i;
int a[10]={10,20};
int *b=a;
printf("%d",1);
printf("%c",a[0]);
printf("%c",a[1]); *****************使用下标法
printf("%c",*b); *****************指针法
printf("%c",*(b+1)); *****************这几句话的汇编代码
printf("%d",2);
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
下面是反汇编的结果:
7: printf("%c",a[0]);
0040B797 mov ecx,dword ptr [ebp-2Ch]
0040B79A push ecx ****************这里是下标法编译后汇编语句
0040B79B push offset string "%c" (0042001c)
0040B7A0 call printf (00401060)
0040B7A5 add esp,8
8: printf("%c",a[1]);
0040B7A8 mov edx,dword ptr [ebp-28h]
0040B7AB push edx
0040B7AC push offset string "%c" (0042001c)
0040B7B1 call printf (00401060)
0040B7B6 add esp,8
9: printf("%c",*b);
0040B7B9 mov eax,dword ptr [ebp-30h]
0040B7BC mov ecx,dword ptr [eax]
0040B7BE push ecx ****************这里是指针法编译后汇编语句
0040B7BF push offset string "%c" (0042001c)
0040B7C4 call printf (00401060)
0040B7C9 add esp,8
10: printf("%c",*(b+1));
0040B7CC mov edx,dword ptr [ebp-30h]
0040B7CF mov eax,dword ptr [edx+4]
0040B7D2 push eax
0040B7D3 push offset string "%c" (0042001c)
0040B7D8 call printf (00401060)
0040B7DD add esp,8
在上面程序中,利用下标访问数组的语句编译后的汇编语句只有2句,而利用指针访问数组元素编译后有3句,显然是利用下标法进行访问比较快些。所以对谭老师书上的那一段话有些质疑。特在此贴出来,希望有心达人能给我补充下,也给那些关注这些问题的喜欢C语言的新朋友提个问题。
下面用程序实验
#include <iostream>
#include <windows.h>
#include <WinBase.h>
#include <ctime>
using namespace std;
int g_number = 0;
int main()
{
int rel1 = 0, rel2 = 0;
const int arysize = 100;
int ary[arysize] = {0};
int test_ok = 0;
int* aryend = &ary[arysize-1]; // 结束元素
for(int i=0;i<arysize;i++)
{
ary[i] = i;
}
DWORD startTime = GetTickCount();
for(int j=0;i<arysize;j++)
{
g_number = ary[j];
printf("%d\n", g_number);
}
DWORD endTime = GetTickCount();
rel1 = endTime - startTime;
startTime = GetTickCount();
for(int* aryptr = ary; aryptr != aryend; aryptr++)
{
g_number = *aryptr;
printf("%d\n", g_number);
}
endTime = GetTickCount();
rel2 = endTime - startTime;
cout<<"数组小标实现速度: "<<rel1<<endl;
cout<<"指针实现方式速度: "<<rel2<<endl;
return 0;
}
测试结果为: