如何解决为什么 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
这些电话的目的是什么?另外,构造函数和析构函数调用在哪里?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。