我意识到,当我经常通过GDB查看某些文件时,在函数开始处有这三行代码
0x08048548 <+0>: lea ecx,[esp+0x4]
0x0804854c <+4>: and esp,0xfffffff0
0x0804854f <+7>: push DWORD PTR [ecx-0x4]
我通常忽略它们,因为在创建这三行堆栈框架之后,通常是函数开始的方式。
谢谢。
[一个好的编译器将检查调用图(找出调用什么),然后决定:
sub esp, 8
(可以与为本地变量保留堆栈空间的任何代码合并)当然,对于一个好的编译器,最后一种情况(需要您显示的代码是非常罕见的。)>
但是;大多数编译器不能很好地执行,因为它们看不到整个程序(如果将程序拆分为单独编译的多个目标文件,则编译器一次只能看到一部分程序)。他们无法弄清楚太多/任何调用图,因此最后一种情况(需要显示的代码)非常普遍。为了解决这个问题,您需要“链接时间代码生成”,但是通常人们不会打扰。
注意:对于AVX2,您需要32字节对齐;对于AVX512,您需要64字节对齐;对于某些事情(为避免在高线程代码中进行错误共享),您可能需要“缓存行大小对齐”(通常也是64字节)对准)。这使得“检查调用图以确定实际需要的对齐方式”算法比我描述的要复杂一些。