我們先來看一下傳指針與傳引用的效率方面的對比吧
- 本質上來說了,傳引用是一個變量的別名而已。並沒有開闢新的空間。而指針了是指向一個空間對應一個空間的地址
- 好吧,我們分別通過兩者效率,和本質方面看一下兩者之間的區別吧。
-首先看一下兩者的效率
看代碼
#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;
}
其實了,可以發現引用就是一個別名,沒有獨立的空間,何其引用實體共用同一塊內存空間,但是底層了實際上是有空間的,引用是按照指針方式來實現的
- 總結一下
- 引用和指針的不同點:
-
- 引用在定義時必須初始化,指針沒有要求
-
- 引用在初始化時引用一個實體後,就不能再引用其他實體,而指針可以在任何時候指向任何一個同類型 實體
-
- 沒有NULL引用,但有NULL指針
-
- 在sizeof中含義不同:引用結果爲引用類型的大小,但指針始終是地址空間所佔字節個數(32位平臺下佔 4個字節)
-
- 引用自加即引用的實體增加1,指針自加即指針向後偏移一個類型的大小
-
- 有多級指針,但是沒有多級引用
-
- 訪問實體方式不同,指針需要顯式解引用,引用編譯器自己處理
-
- 引用比指針使用起來相對更