【发布时间】:2017-04-29 17:59:16
【问题描述】:
为什么 GCC 编译器在使用 double 时添加这三行而在使用 Int 时不添加?
带整数:
#include <cstdio>
int main(){
int i = 1;
}
==>
main:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 1
mov eax, 0
leave
ret
双倍:
#include <cstdio>
int main(){
double i = 1;
}
==>
main:
lea ecx, [esp+4] // This three lines
and esp, -8 // ...
push DWORD PTR [ecx-4] // ...
push ebp
mov ebp, esp
push ecx
sub esp, 20
fld1
fstp QWORD PTR [ebp-16]
mov eax, 0
add esp, 20
pop ecx
pop ebp
lea esp, [ecx-4]
ret
使用指针时也会发生类似的情况,例如 int *s = new int(4);
您能解释一下为什么会发生这种情况,为什么不总是这样吗?
【问题讨论】:
-
如果您不使用
-O3开关,编译器生成的代码可能是多余的或无意义的(尽管仍然正确) -
是的,我知道。我只是在学习:)
-
这是 C 还是 C++?它们是不同的语言,可能会为函数进入/退出生成不同的代码。
-
@MargaretBloom:不是废话。只是多余的。但通常更容易被初学者理解并且更容易调试。不过,通常最好使用
-Og进行编译以进行调试。
标签: c++ c gcc x86 reverse-engineering