2010-08-06 36 views
8

历史上,为什么它看起来像是每个人和他们的孩子兄弟定义他们自己的调用约定?你有C,C++,Windows,Pascal,Fortran,Fastcall,可能还有一些我不认为提及的其他人。对于绝大多数用例来说,不应该有一个约定是最有效的吗?是否有任何理由相对于另一方偏好?为什么有这么多不同的调用约定?

+0

+1我第二个问题! – Poni 2010-08-06 22:54:03

回答

10

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

注意比引入x64时至少在Windows上设计的一个单一的调用约定。

雷蒙德陈写了一个关于调用约定的历史的伟大系列,你可以开始here

+2

我喜欢Raymond Chen的文章。它回答了很多问题。 – dsimcha 2010-08-09 15:22:35

1

因为历史上每个人和他们的孩子兄弟确实定义了自己的调用约定。它们都是为不同的目的而创建的,因此受到不同性能需求的驱动。例如,C++主张优化传递参数this

0

一部分是微处理器(或处理器)的底层结构。大多数语言都是从特定的CPU开始的,并且与该体系结构纠缠一点。例如,旧的Univac 1100系列计算机甚至没有调用堆栈!

另一部分原因是,直到你尝试了几种做事方式,才能预见到最佳解决方案。

0

它们是为不同的目的和不同的优化系统而创建的。例如,为了减少“堆栈溢出”(无双关意图),一些人想到各种不同的想法来调用函数来使堆栈溢出成为不可能。

另一个实例是Lambda微积分。不要太模糊,但在Lambda中,函数只能传递一个参数并返回一个值,因此也需要自己的调用约定。

相关问题