据我了解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);