首先先來看一段**:
int main()
通過vs除錯模式下檢視反彙編有如下結果:
char& refvar = var;
000d2a3c lea eax,[var]
000d2a3f mov dword ptr [refvar],eax
char* ptrvar = &var;
000d2a42 lea eax,[var]
000d2a45 mov dword ptr [ptrvar],eax
很顯然變數refvar和ptrvar所指向的記憶體位址都儲存了變數var的位址,即**中的[var]。
cout << refvar;
000d2a48 mov eax,dword ptr [refvar]
000d2a4b movzx ecx,byte ptr [eax]
000d2a4e push ecx
...000d2a56 call std::operator<<> (0d1532h)
... cout << ptrvar;
000d2a5e mov eax,dword ptr [ptrvar]
000d2a61 push eax
...
000d2a69 call std::operator<<> (0d153ch)
...
有趣的來了,在呼叫cout函式輸出refvar和ptrvar的時候,前者將refvar得值所指向的記憶體位址的值作為引數(即var),而後者則直接將ptrvar得值作為引數(即&var)。
是不是很神奇,其實c/c++的彙編**都一致,不同在於c++的一些特性如const、private都是通過編譯器來實現,引用的本質上是乙個常量指標。只不過在編譯器層進行相應的處理,使得程式設計師在使用時直覺上認為引用就是變數的別名。如上所示輸出refvar的時候編譯器的處理是先獲得refvar的值,再以該值作為位址去訪問資料,而在輸出指標所指向的值時需要程式設計師自己來實現這些操作,否則只能輸出位址值。
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 引用本質
引用本質究竟是什麼?或者說引用在計算機底層是怎麼實現的?我們來看下面一段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...
C 引用的本質
引用的意義 1 引用作為其他變數的別名而存在,因此在一些場合可以代替指標 2 引用相對於指標來說具有更好的可讀性和實用性 引用的本質 1 單獨定義普通引用時 必須初始化,說明很像乙個常量 includeusing namespace std 1 第一點 單獨定義普通引用時 必須初始化,說明很像乙個常...