ubuntu18(g++、gdb)
#include<iostream> #include<stdio.h> using namespace std; int main(){ int x = 1; int y = 2; int &b = x; return 0; }
编译带参数 -g
gdb ./程序名
break main
run
display/i $pc
相关结果如下:
7 int x = 1;
1: x/i $pc
=> 0x5555555547c1 <main()+23>: movl $0x1,-0x18(%rbp)
(gdb)
8 int y = 2;
1: x/i $pc
=> 0x5555555547c8 <main()+30>: movl $0x2,-0x14(%rbp)
(gdb)
9 int &b = x;
1: x/i $pc
=> 0x5555555547cf <main()+37>: lea -0x18(%rbp),%rax
(gdb)
10 return 0;
解释如下:(自己瞎猜的,好像是最新的g++生成的汇编代码和老版本的汇编代码不太一样了,也可能是我命令输入的和其他对方不一样)
=> 0x5555555547c1 <main()+23>: movl $0x1,-0x18(%rbp) 把 $0x1的值放入到地址 -0x18 中
=> 0x5555555547cf <main()+37>: lea -0x18(%rbp),%rax 把 地址 -0x18这个地址放到寄存器 rax 中
从汇编层次上来看,引用的确是通过指针来实现的
第二次测试:
命令如下:
g++ -g -c cite.cpp
objdump -S cite.o
int x = 1;
17: c7 45 ec 01 00 00 00 movl $0x1,-0x14(%rbp)
int &b = x;
1e: 48 8d 45 ec lea -0x14(%rbp),%rax
22: 48 89 45 f0 mov %rax,-0x10(%rbp)
参考:https://www.cnblogs.com/xkfz007/archive/2012/02/05/2338758.html