C 引用本質

2021-08-28 03:42:49 字數 1144 閱讀 7255

首先先來看一段**:

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 第一點 單獨定義普通引用時 必須初始化,說明很像乙個常...