c++ - 为什么 g++ 编写调用下一条指令的代码?
问题描述
我在 windows 上使用 g++ 编译了以下代码,以测试构造函数和析构函数调用的确切位置:
class foo{
volatile int x;
public:
foo(){
x = 9;
return;
}
~foo(){
x = 10;
return;
}
};
int main(){
volatile int x = 7;
if(x == 7){
volatile foo jjj;
volatile int y = 8;
if(y == 8){
goto out;
}
y = 10;
}
out:
x = 10;
}
然后我反汇编了这个对象,我没有找到对构造函数或析构函数的调用。另外,我发现调用下一行的奇怪指令。
0000000000000000 <main>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: 48 83 ec 30 sub rsp,0x30
8: e8 00 00 00 00 call d <main+0xd> ; calling next line
d: c7 45 fc 07 00 00 00 mov DWORD PTR [rbp-0x4],0x7
14: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
17: 83 f8 07 cmp eax,0x7
1a: 0f 94 c0 sete al
1d: 84 c0 test al,al
1f: 74 38 je 59 <main+0x59>
21: 48 8d 45 f8 lea rax,[rbp-0x8]
25: 48 89 c1 mov rcx,rax
28: e8 00 00 00 00 call 2d <main+0x2d> ; calling next line
2d: c7 45 f4 08 00 00 00 mov DWORD PTR [rbp-0xc],0x8
34: 8b 45 f4 mov eax,DWORD PTR [rbp-0xc]
37: 83 f8 08 cmp eax,0x8
3a: 0f 94 c0 sete al
3d: 84 c0 test al,al
3f: 75 09 jne 4a <main+0x4a>
41: c7 45 f4 0a 00 00 00 mov DWORD PTR [rbp-0xc],0xa
48: eb 01 jmp 4b <main+0x4b>
4a: 90 nop
4b: 48 8d 45 f8 lea rax,[rbp-0x8]
4f: 48 89 c1 mov rcx,rax
52: e8 00 00 00 00 call 57 <main+0x57> ; calling next line
57: eb 01 jmp 5a <main+0x5a>
59: 90 nop
5a: c7 45 fc 0a 00 00 00 mov DWORD PTR [rbp-0x4],0xa
61: b8 00 00 00 00 mov eax,0x0
66: 48 83 c4 30 add rsp,0x30
6a: 5d pop rbp
6b: c3 ret
6c: 90 nop
6d: 90 nop
6e: 90 nop
6f: 90 nop
这些电话的目的是什么?另外,构造函数和析构函数调用在哪里?
解决方案
推荐阅读
- linux - 切换用户文件权限
- machine-learning - sklearn:SVR 无法泛化加法器功能
- node.js - 使用 Google Drive API 查看文件夹内容需要什么权限
- c++ - 如何从 C++ 的循环中追加字符串?
- python - 如何绘制带有图例的非结构化 numpy 数组?
- c++ - 为什么局部类的成员函数可以访问函数参数但不能访问局部变量?
- performance - 计算 IF-ELSE 的操作次数
- python - 按最高元素对数组字典进行排序
- python - 当我运行我的 python 代码时,我的 tkinter 窗口不会响应
- css - CSS选择器:有没有办法选择除第一个元素之外的所有后代?