为什么Microsoft选择stdcall作为他们的API约定?

时间:2010-08-24 10:56:18

标签: windows winapi calling-convention stdcall

有充分的理由吗?

他们的内部函数(未导出)是否也是stdcall约定?

2 个答案:

答案 0 :(得分:8)

它适用于32位代码的pascal调用约定。 Pascal是OS / 2和Windows 3等16位操作系统的调用约定。为什么选择pascal是一种猜测,即使我当时是一只小小狗,但效率稍高。当您需要使用640 KB时,这一点很重要。

大多数Win32函数都不是真正的stdcall,因为它还规定了导出函数在呈现给链接器之前是如何修饰的。像void Mumble(int arg)变成_Mumble @ 4。 @后面的数字描述激活帧大小。但是大多数Win32功能都没有任何装饰。可能会让程序员有机会使GetProcAddress()工作。我认为装饰旨在帮助链接器检测声明的API函数签名与实际签名之间的不匹配。传递的参数数量不匹配是一个自动的kaboom,因为被调用者会从堆栈中弹出更多或更少的参数然后传递。很难诊断。 stdcall的弱点,cdecl约定没有这个问题。

内部调用是stdcall,cdecl和thiscall之间的混合包。不能说我曾经检测过一种模式,虽然单步执行的Windows代码并不是我喜欢做的事情。

答案 1 :(得分:4)

使用stdcall编译的代码明显小于使用cdecl(替代方法)编译的代码。在做出决定时,较小的代码是更快的代码。