从历史上看,为什么似乎每个人和他们的弟弟都定义了自己的称呼习惯?你有 C、C++、Windows、Pascal、Fortran、Fastcall 以及可能还有无数其他我没想到的。对于绝大多数用例来说,一种约定不应该是最有效的吗?有什么好的理由更喜欢一个吗?
最佳答案
您提到的调用约定是在数十年来为不同语言和不同硬件设计的。他们都有不同的目标。 cdecl 支持 printf 的可变参数。 stdcall 导致更小的代码生成,但没有可变参数。 Fastcall 可以大大加快在旧机器上只有一两个参数的简单函数的性能(但今天很少有加速。)
请注意,当 x64 被引入时,至少在 Windows 上,它被设计为具有单一的调用约定。
Raymond Chen 在调用约定的历史上写了一个很棒的系列,您可以开始 here .
关于assembly - 为什么有这么多不同的调用约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3428332/