2010-08-24 47 views

回答

8

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

大多数Win32函数不是真正的stdcall,因为它还规定了在呈现给链接器之前导出的函数是如何装饰的。像void Mumble(int arg)变成_Mumble @ 4一样。 @之后的数字描述了激活帧的大小。但大多数Win32函数都是在没有任何装饰的情况下导出的可能会让程序员有机会让GetProcAddress()工作。我认为装饰的目的是帮助链接器检测声明的API函数签名和实际API签名之间的不匹配。传递的参数数量不匹配是自动kaboom,因为被调用者将弹出或多或少的参数,然后通过。很难诊断。 stdcall的弱点,cdecl约定没有这个问题。内部呼叫是stdcall,cdecl和thiscall之间的混合包。不能说我曾经发现过一种模式,尽管单步执行Windows代码并不是我喜欢做的事情。

+2

缺少符号装饰是因为winapi二进制文件使用'.def'文件导出(装饰和/或使用ordianl),这使得通过GetProcAddress简单导入,因为没有符号装饰 – Necrolis 2010-08-24 12:04:17

+0

好点,我认为你是对的。 – 2010-08-24 12:05:42

4

使用stdcall编译的代码比使用cdecl编译的代码(可选)要小得多。在做出决定时,较小的代码是更快的代码。

+0

其实我更喜欢Hans Passant对我的回答,但是无论如何。 – 2010-08-25 03:38:36

+0

因为你是一个微软(长期),我选择了你的答案。 – Benjamin 2010-08-25 21:20:23

+0

你是否有任何证据表明这一说法?直觉上来说,我认为它应该是stdcall和cdecl之间的一种冲突,而且Google的两种调用约定之间没有任何大小的比较。 – 2015-08-31 10:35:21

相关问题