gpt4 book ai didi

c++ - Int vs Double 汇编

转载 作者:搜寻专家 更新时间:2023-10-30 23:53:26 26 4
gpt4 key购买 nike

为什么 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);

你能解释为什么会发生这种情况,为什么不总是这样?

最佳答案

如果 double 在自动范围内(在堆栈上),额外的代码将堆栈帧对齐到偶数 8 字节边界,以便 double变量存储在具有适当对齐方式的内存地址中。进入函数时,堆栈指针不能保证在偶数 8 字节边界上对齐,编译器会添加额外的代码来实现这一点。

这就是 and esp, -8 所做的。 -8 是 0xFFFFFFF8。这将清除 esp 的最后 3 位,使用 ,使其指向一个偶数 8 字节的边界内存地址,将其向下调整(堆栈从高内存增长到低内存地址)。

关于c++ - Int vs Double 汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41142029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com