x64堆栈参数的大小和对齐方式

时间:2015-09-16 16:29:02

标签: c stack 64-bit memory-alignment

据我了解Windows中的x64调用约定(基于thisthis):

  • 前4个参数在寄存器中传递,尽管堆栈中保留了32个字节的阴影大小。
  • 整个堆栈必须是16字节对齐的(尽管不一定是单独的参数)。
  • 1,2,4或8字节的参数可以进入堆栈。所有其他参数必须通过引用传递。

个别参数如何对齐?由于我找不到任何专门针对此问题的内容,并且基于我认为x86中的对齐方式,我假设32位整数可以在4字节边界处对齐。因此,例如,如果函数参数5和6都是32位整数,我会期望它们处于堆栈偏移32和36.然而,从查看我的编译器的汇编输出,它们处于偏移32和40 (即,它们是8字节对齐的,即使它们占用4个字节)。

换句话说,为什么以下函数调用在x64中工作,即使它在预期32位整数时传递64位uint64_t

int i = 1;
uint64_t p = 6;
double v = 2.5;
printf("%i %.*f\n%i %.*f\n", i, p, v, i, p, v);

0 个答案:

没有答案