快速调用64位

时间:2012-07-10 22:00:48

标签: unix 64-bit x86-64 stdcall fastcall

我一直在阅读32位呼叫约定的差异。 fastcallstdcall的折磨是。

从我读到的内容来看,两个约定存在很大的混淆,64位被标准化以避免这种混淆。

我不得不问,为什么选择fastcall

此外,由于fastcallstdcall是win32术语,函数调用的UNIX术语是什么,或者不使用寄存器来传递参数?

1 个答案:

答案 0 :(得分:2)

x86 Calling Conventions - Wikipedia, the free encyclopedia提供了一个列表。

x86-32上的公共调用约定是cdecl。 GCC提供了一个函数属性__attribute__((regparm(n)))来指示寄存器传递n个参数,但这与fastcall不同。无论哪种方式,参数都在callee-clobberable寄存器中传递,因此相对于cdecl的函数调用没有额外的成本(并且节省了为参数添加堆栈空间然后清理它的工作量)(对于regparm })和stdcall(适用于fastcall)。

为了避免混淆,Windows和Linux上的x86-64调用约定与x86-32上的x86-64调用约定不同。两者都不是fastcall,尽管两者都使用大量寄存器来传递参数。