C 引用本質

2021-08-09 08:53:38 字數 1353 閱讀 9316

引用本質究竟是什麼?或者說引用在計算機底層是怎麼實現的?

我們來看下面一段c++**:

(1) int x = 5;

(2) int &y = x;

(3) y = 8;

在vs2013下反彙編得到下面彙編**:

//對應(1)

mov 

dword ptr [x], 5                                 

// 將常量5送入變數x中

//對應(2)

lea   eax, [x]                                             // 取x的位址並送入eax暫存器中

mov dword ptr [y], eax                             // 將eax暫存器中的內容送入變數y中

//對應(3)

mov eax, dword ptr [y]                             // 將變數y中的內容送入eax暫存器中

mov dword ptr [eax], 8                             // 將常量8送入以eax為位址的記憶體單元中

從彙編**中可以看出,y的型別為dword,佔據4個位元組。因此,y實際上就是乙個變數,它存放被引用變數的位址。一般來說,位址是由指標變數儲存的,那麼引用變數和指標變數有什麼區別呢?

我們接著看下面一段**:

(a) int x = 5;

(b) int * const y = &x ;

(c) *y = 8;

在vs2013下反彙編得到下面彙編**:

//對應(a)

mov 

dword ptr [x], 5

//對應(b)

lea   eax, [x]

mov dword ptr [y], eax

//對應(c)

mov eax, dword ptr [y]

mov dword ptr [eax], 8

我們驚奇的發現所得的彙編**和第一段所對應的彙編**完全一樣。因此,引用變數在功能上相當於指標常量,即一旦指向某個單元就不能再改變。在底層,引用變數也是按照指標常量的方式來實現的。

在高階語言層面上,引用變數和指標常量的關係如下:

(1) 在記憶體中都佔據4個位元組的空間,存放的都是被引用物件的位址,都必須在定義的時候初始化。

(2) 指標常量本身允許定址(以x為例),即&x是指標常量所在記憶體單元的位址,被引用物件用*x表示;引用

變數不允許定址(以y為例),&y指的是被引用物件的位址(即y本身),並不是y所在記憶體單元的位址(y的位址有編譯器管理,程式設計師無法訪問),被引用物件直接用y表示。

C 引用本質

b 50 mov eax,dword ptr b mov dword ptr eax 32h int d a lea eax,a mov dword ptr d eax d 60 mov eax,dword ptr d mov dword ptr eax 3ch 以上的 均來自具體的編譯器,怎麼樣,...

C 引用本質

首先先來看一段 int main 通過vs除錯模式下檢視反彙編有如下結果 char refvar var 000d2a3c lea eax,var 000d2a3f mov dword ptr refvar eax char ptrvar var 000d2a42 lea eax,var 000d2...

C 引用的本質

引用的意義 1 引用作為其他變數的別名而存在,因此在一些場合可以代替指標 2 引用相對於指標來說具有更好的可讀性和實用性 引用的本質 1 單獨定義普通引用時 必須初始化,說明很像乙個常量 includeusing namespace std 1 第一點 單獨定義普通引用時 必須初始化,說明很像乙個常...