从历史上看,为什么几乎每个人和他们的弟弟都定义了自己的通话约定?您已经拥有C,C++,Windows,Pascal,Fortran,Fastcall,还有可能我想不提的无数其他产品。对于大多数用例来说,一个约定不是最有效的吗?是否有任何充分的理由偏爱一个?
最佳答案
您提到的调用约定是几十年来针对不同语言和不同硬件而设计的。他们都有不同的目标。 cdecl支持printf的变量参数。 stdcall产生了更小的代码生成,但没有可变参数。在较早的机器上,仅使用一个或两个参数,Fastcall可以极大地提高简单函数的性能(但如今很少有这样的速度)。
请注意,至少在Windows上引入x64时,它被设计为具有单个调用约定。
Raymond Chen在调用约定的历史上撰写了一系列精彩的文章,您可以启动here。
关于assembly - 为什么会有这么多不同的调用约定?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3428332/