数组的访问-下标访问和指针引用访问哪个更快?

昨天我们上c语言课,老师在讲数组的访问的时候,说到:数组的指针访问比下标访问更快原话在谭浩强先生的c程序设计第五版-p229最初我对这个有点疑问:指针访问不应该是间接访问问嘛?为什么会比下标直接放更快呢?课后我去问老师,老师说因为下标访问需要计算位置,int类型加4字节,而指针只需要找门牌号,效率更高……这样似乎合情合理,但事实真的是这样吗?
后来我决定设计一个程序测试一下,我开了一个10万的数组,为了保证真实性,使用devc++,使用随机数赋值,然后访问()逐一遍历,可是事实并没有如我所愿,于是我试了二十多次,得到了,无论是指针访问还是下标访问,运行时间定格在14-15.5s之内,这个结果告诉我,他们是一样快的,

#include <iostream>
#include <time.h>
#include <cstdlib>
#define MAXN 100000
using namespace std;
int a[MAXN];
int main()
{

	srand(time(NULL));

	for(int i=0;i<MAXN;i++)
	{
		a[i]=rand()%1000+1;
	}
//	for(int i=0;i<MAXN;i++)
//	{
//		cout<<a[i]<<' ';
//	}
	
	for(int *b=a;b<a+MAXN;b++)
	{
		cout<<*b<<' ';
	}




	return 0;
 }

可能是这个程序有瑕疵,我对结果并没有完全相信,于是换一种思路,用时间函数只测试遍历数组的把一段代码,由於单位是毫秒,保险起见,开了大整形,我又试了十多次结果指针半数明显快于下标,剩下的一本依然是指针以微弱的优势打败了下标,这次程序设计没有其他程序的干扰,为了更有说服了,我的数组不够大,于是又有加了一位数量级,爆栈了。

#include <iostream>
#include <time.h>
#include <cstdlib>
#define MAXN 100000
using namespace std;
int a[MAXN];
int main()
{
	srand(time(NULL));

	for(int i=0;i<MAXN;i++)
	{
		a[i]=rand()%1000+1;
	}
	
	long  start1,end1,start2,end2;
	start1 = clock();
	for(int i=0;i<MAXN;i++)
	{
		cout<<a[i]<<' ';
	}
	end1 = clock();
	
	start2 = clock();

	
	for(int *b=a;b<a+MAXN;b++)
	{
		cout<<*b<<' ';
	}
	end2 = clock();
	cout<<"下标用时:"<<end1-start1;
	cout<<"指针用时:"<<end2-start2;

	return 0;
 }

以上的测试结果,编译环境均是64-devc++,一步一步排除,事实似乎还是不能下定论,我查阅了大量资料,数组的三种访问,下标访问和解引用访问是一样的,很多人包括我,多错在了这个地方,真正的指针引用法,是重新建立一个指针,指向数组的首元素,然后,地址偏移,不管怎么说,指针更加灵活,其实他们的效率的差别很小,这微笑的时间差,对大多数人没有任何影响,其实我还忽略了一个事实,cup的寄存器还有高速缓冲区的影响,对于访问次数较多的情况,会把它拿进寄存器,对于这些,我会继续深入学习,不少大佬用汇编的思想解释了,早就有人发现了这个问题,但是这本《c程序设计》作为高校教材已经久远了,为什么不能质疑他,亚里士多德还说过呢:我爱我的老师,可我更爱真理。我认为:尊重真理就是尊重老师。哪怕我提出的质疑是错的,对人不对事,因为这个问题,昨天和一位朋友不说大吵一顿,至少我凶他哈哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章