我一直在阅读 32 位调用约定的差异。与磨难就是fastcall
。stdcall
根据我的阅读,这两种约定存在很大的混淆,并且 64 位被标准化以避免这种混淆。
我不得不问,为什么被fastcall
选中?
另外,既然fastcall
andstdcall
是 win32 术语,那么 UNIX 术语中表示使用或不使用寄存器来传递参数的函数调用是什么?
x86 Calling Conventions - 维基百科,免费的百科全书提供了一个列表。
x86-32 上的通用调用约定是cdecl
. GCC 提供了一个函数属性__attribute__((regparm(n)))
来指示n
参数是通过寄存器传递的,但这与fastcall
. cdecl
无论哪种方式,参数都在被调用者可破坏的寄存器中传递,因此对于与(for regparm
) 和stdcall
(for )相关的函数调用,没有额外的成本(并且节省了为参数添加堆栈空间然后清理它的工作fastcall
)。
为了帮助您混淆,Windows 和 Linux 上的 x86-64 调用约定与 x86-32 上的调用约定以及彼此不同。两者都不是fastcall
,尽管两者都使用大量寄存器来传递参数。