指针和数组 谁快

谭浩强老师的《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;
}

测试结果为:

转载于:https://www.cnblogs.com/alionxd/articles/3028306.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值