引用本質究竟是什麼?或者說引用在計算機底層是怎麼實現的?
我們來看下面一段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 第一點 單獨定義普通引用時 必須初始化,說明很像乙個常...