1. 程式人生 > >指標與引用的效能比較

指標與引用的效能比較

我們先來看一下傳指標與傳引用的效率方面的對比吧

  • 本質上來說了,傳引用是一個變數的別名而已。並沒有開闢新的空間。而指標了是指向一個空間對應一個空間的地址
  • 好吧,我們分別通過兩者效率,和本質方面看一下兩者之間的區別吧。
    -首先看一下兩者的效率
    看程式碼

#include<iostream>
#include<time.h>
using namespace std;
//memcpy淺拷貝
//typeid
struct A { 
	int a[10000];
};


void TestFunc1(A a) {}

void TestFunc2(A& a) {}

void TestRefAndValue() {
	A a;

	// 以指標作為函式引數   
	size_t begin1 = clock();  

	for (size_t i = 0; i < 10000; ++i)    
		TestFunc1(a);  
	
		size_t end1 = clock();

	// 以引用作為函式引數   
		size_t begin2 = clock();   
		for (size_t i = 0; i < 10000; ++i)   
			TestFunc2(a);   
		size_t end2 = clock();
		cout << "TestFunc1(int*)-time:" << end1 - begin1 << endl;  
		cout << "TestFunc2(int&)-time:" << end2 - begin2 << endl;
}

// 執行多次,檢測指標和引用在傳參方面的效率區別 
int main() {    for (int i = 0; i < 10; ++i)   
	{      
		TestRefAndValue();   
	}         
		return 0;
}


在這裡插入圖片描述
傳引用還是要快一些啊!!!
傳值傳指標還是有一點區別的啊

  • 在來看一下他們呼叫過程中的彙編程式碼
int main() 
{
	int a = 10;        
	int& ra = a;  
	ra = 20;      
	int* pa = &a;    
	*pa = 20;     
	return 0;
}

在這裡插入圖片描述
其實了,可以發現引用就是一個別名,沒有獨立的空間,何其引用實體共用同一塊記憶體空間,但是底層了實際上是有空間的,引用是按照指標方式來實現的

  • 總結一下
  • 引用和指標的不同點:
    1. 引用在定義時必須初始化,指標沒有要求
    1. 引用在初始化時引用一個實體後,就不能再引用其他實體,而指標可以在任何時候指向任何一個同類型 實體
    1. 沒有NULL引用,但有NULL指標
    1. 在sizeof中含義不同:引用結果為引用型別的大小,但指標始終是地址空間所佔位元組個數(32位平臺下佔 4個位元組)
    1. 引用自加即引用的實體增加1,指標自加即指標向後偏移一個型別的大小
    1. 有多級指標,但是沒有多級引用
    1. 訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理
    1. 引用比指標使用起來相對更