为什么会有这么多不同的调用约定?

dsi*_*cha 8 assembly history calling-convention low-level

从历史上看,为什么它似乎只是关于每个人和他们的孩子兄弟定义他们自己的呼叫惯例?你有C,C++,Windows,Pascal,Fortran,Fastcall以及其他可能没有提及的其他人.对于绝大多数用例,一项公约不应该是最有效的吗?是否有任何理由更喜欢一个而不是另一个?

Mic*_*ael 10

您提到的调用约定是针对不同语言和不同硬件而设计的.他们都有不同的目标.cdecl支持printf的变量参数.stdcall导致代码生成较小,但没有变量参数.Fastcall可以大大加快简单函数的性能,在旧机器上只有一个或两个参数(但现在很少加速).

请注意,与推出x64时相比,至少在Windows上,它被设计为具有单个调用约定.

Raymond Chen写了一篇关于调用约定历史的精彩系列,你可以从这里开始.

  • 我喜欢Raymond Chen的文章.它回答了很多问题. (2认同)