指標與引用的效能比較
阿新 • • 發佈:2019-01-13
我們先來看一下傳指標與傳引用的效率方面的對比吧
- 本質上來說了,傳引用是一個變數的別名而已。並沒有開闢新的空間。而指標了是指向一個空間對應一個空間的地址
- 好吧,我們分別通過兩者效率,和本質方面看一下兩者之間的區別吧。
-首先看一下兩者的效率
看程式碼
#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,指標自加即指標向後偏移一個型別的大小
-
- 有多級指標,但是沒有多級引用
-
- 訪問實體方式不同,指標需要顯式解引用,引用編譯器自己處理
-
- 引用比指標使用起來相對更