此文緣起我看了這篇文章:
http://blog.csdn.net/newslxw/archive/2006/08/08/1038972.aspx
還記得當年讀書時, 牛牛的C++老師告訴我: "引用, 其實就是別名, 與其所引用的對象完全等價". 可是, 我還是有這點疑問: "等價的含義, 是指的什麼? 難道是說在最底層的實現上兩者直接就是使用的同一個記憶體位置嗎? " 比如下面的這段代碼:
int main()
...{
int a = 100;
int &b = a;
int *c = &a;
b = 99;
a = 88;
b = 77;
*c = 66;
return 0;
}
經過彙編後, 變成了這樣:
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
.LCFI5:
movl $100, -16(%ebp) ; ebp-16 為變數 a 的地址
leal -16(%ebp), %eax
movl %eax, -12(%ebp) ; 將a的地址放在 ebp-12 地址處
leal -16(%ebp), %eax
movl %eax, -8(%ebp) ; ebp-8是指標c變數, 此句是給指標c賦值
movl -12(%ebp), %eax ; 給引用b賦值前, 先把存在 ebp-12 的 a 的地址取到eax中
movl $99, (%eax) ; b = 99
movl $88, -16(%ebp)
movl -12(%ebp), %eax ; 此處給引用b的賦值, 與前面一樣, 也是先取a的地址
movl $77, (%eax)
movl -8(%ebp), %eax ; 給*c賦值前, 先取c地址
movl $66, (%eax) ; 此處執行 *c = 66
movl $0, %eax
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
由此可見, 引用, 在具體實現時, 會申請一個臨時空間(棧內空間), 目的是存放被引用對象的地址. 當使用引用變數時, 其實就是對被引用對象作了一次間接定址. 而從彙編代碼中來看, *c 確實與 b 在使用時的彙編代碼一樣, 都是先取地址, 再將值存入此地址. 所不同的, 只是在c++層面, 作為如 b 這樣的參考型別變數, 只可在初始化時賦值, 且只能賦值一次.