數組的訪問-下標訪問和指針引用訪問哪個更快?

昨天我們上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程序設計》作爲高校教材已經久遠了,爲什麼不能質疑他,亞里士多德還說過呢:我愛我的老師,可我更愛真理。我認爲:尊重真理就是尊重老師。哪怕我提出的質疑是錯的,對人不對事,因爲這個問題,昨天和一位朋友不說大吵一頓,至少我兇他哈哈。

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