在C++ Primer Plus中,最開始介紹的是變數和引用變數。變數實際就包含了左值型別的變數和右值型別的變數。
引用變數
引用是C++引入的概念,引用變數是已定義的變數的別名(alias)。引用的建立示例如下:
int a = 10;
int &b = a;
引用在定義時必須初始化,這點和const限定的變數很像,為什麼需要初始化呢?透過compiler explorer分析其彙編:
第一句int a = 10
對應2句彙編:
movs r3, #10 ;把立即數10存到暫存器r3
str r3, [r7] ;將r3暫存器的值存到r7暫存器裡面的那個記憶體地址,而r7在第4行被設定為sp + 0,
;sp即棧指標暫存器。也就是說此時r7儲存的記憶體地址就是棧頂。總的看來就是在棧頂壓入了一個變數,變數值為10。
;這也是區域性變數分配記憶體和儲存的方式。
第二句int &b = a;
對應:
mov r3, r7 ;將r7儲存的內容(還是sp + 0,也即棧頂記憶體地址)儲存到暫存器r3
str r3, [r7, #4];將r3內容(此刻的棧頂)儲存到棧頂偏移4位元組的地方,也就是棧上申請了4個位元組空間儲存區域性變數a的地址。
第三句b = 5;
對應:
ldr r3, [r7, #4];載入變數a的地址到r3中
movs r2, #5 ;r2存入立即數5
str r2, [r3] ;r2裡面的值儲存到r3裡面記憶體地址指向的地方,也就是變數a的儲存空間。