引用在汇编层次上面的解释

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


posted @ 2021-04-10 15:42  王清河  阅读(183)  评论(0编辑  收藏  举报