在C++ Primer Plus中,最开始介绍的是变量和引用变量。变量实际就包含了左值类型的变量和右值类型的变量。
引用变量
引用是C++引入的概念,引用变量是已定义的变量的别名(alias)。引用的创建示例如下:
int a = 10;
int &b = a;
引用在定义时必须初始化,这点和const限定的变量很像,为什么需要初始化呢?通过compiler explorer分析其汇编:
第一句int a = 10
对应2句汇编:
movs r3, #10 ;把立即数10存到寄存器r3str r3, [r7] ;将r3寄存器的值存到r7寄存器里面的那个内存地址,而r7在第4行被设置为sp + 0, ;sp即栈指针寄存器。也就是说此时r7存储的内存地址就是栈顶。总的看来就是在栈顶压入了一个变量,变量值为10。;这也是局部变量分配内存和存储的方式。
第二句int &b = a;
对应:
mov r3, r7 ;将r7存储的内容(还是sp + 0,也即栈顶内存地址)存储到寄存器r3str r3, [r7, #4];将r3内容(此刻的栈顶)存储到栈顶偏移4字节的地方,也就是栈上申请了4个字节空间存储局部变量a的地址。
第三句b = 5;
对应:
ldr r3, [r7, #4];加载变量a的地址到r3中movs r2, #5 ;r2存入立即数5str r2, [r3] ;r2里面的值存储到r3里面内存地址指向的地方,也就是变量a的存储空间。