指針與引用的性能比較

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

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

#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. 引用比指針使用起來相對更
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章