引用變數

thammer發表於2024-08-27

在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的儲存空間。

相關文章