我一直在阅读32位呼叫约定的差异。 fastcall
与stdcall
的折磨是。
从我读到的内容来看,两个约定存在很大的混淆,64位被标准化以避免这种混淆。
我不得不问,为什么选择fastcall
?
此外,由于fastcall
和stdcall
是win32术语,函数调用的UNIX术语是什么,或者不使用寄存器来传递参数?
答案 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
,尽管两者都使用大量寄存器来传递参数。