回答
这是对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代码并不是我喜欢做的事情。
缺少符号装饰是因为winapi二进制文件使用'.def'文件导出(装饰和/或使用ordianl),这使得通过GetProcAddress简单导入,因为没有符号装饰 – Necrolis 2010-08-24 12:04:17
好点,我认为你是对的。 – 2010-08-24 12:05:42
使用stdcall编译的代码比使用cdecl编译的代码(可选)要小得多。在做出决定时,较小的代码是更快的代码。
其实我更喜欢Hans Passant对我的回答,但是无论如何。 – 2010-08-25 03:38:36
因为你是一个微软(长期),我选择了你的答案。 – Benjamin 2010-08-25 21:20:23
你是否有任何证据表明这一说法?直觉上来说,我认为它应该是stdcall和cdecl之间的一种冲突,而且Google的两种调用约定之间没有任何大小的比较。 – 2015-08-31 10:35:21
- 1. 为什么微软选择MVC构建ASP.net MVC?
- 2. 他们为什么决定让接口具有“可选操作”
- 3. 显示的emojis与他们选择的不同,为什么?
- 4. 为什么微软的_wspawnv返回EINVAL?
- 5. 为什么输入和选择框在他们的价值观
- 6. 微软在他们的网站中使用什么WebGrid?
- 7. 为什么我不能选择微调的第一选择?
- 8. 泡菜:他们为什么这么叫?
- 9. 为什么我的参数targetplatformversion不能为null在微软视觉工作室
- 10. 为什么我们选择Beta分布作为假设的先验?
- 11. 将调用约定从cdecl更改为stdcall
- 12. 为什么他们有相同的ID?
- 13. 为什么Twitter有/ 1他们的API网址?
- 14. 为什么人们将他们的文件命名为index.html?
- 15. 为什么jQuery选择器不工作?
- 16. 其他操作如下微调选择
- 17. 为什么选择排序不稳定?
- 18. 为什么选择HTML5地理定位?
- 19. 为什么选择双重锁定?
- 20. 为什么他们在编程中选择像16,32,128这样的数字?
- 21. 他们用什么软件来制作这样的视频?
- 22. 为什么你特别选择的论坛软件适合你?
- 23. 为什么选择用于Cygwin软件包的bin和src?
- 24. 为什么微软将Velocity Distributed Cache作为独立产品摆脱?
- 25. 微软的Outlook API
- 26. 微软Access - 表单列表框选择作为报表的数据需求
- 27. 从表2场选择并加入他们作为字符串
- 28. 为什么选择AsyncCallback?
- 29. 为Web开发选择非微软语言?
- 30. 为什么他们两个不相等
为什么Microsoft *选择* stdcall作为它们的API约定? – JustBoo 2010-08-24 13:51:42
谢谢康斯坦丁:) – Benjamin 2010-08-24 14:50:50