【发布时间】:2023-03-07 09:59:01
【问题描述】:
我一直在阅读 32 位调用约定的差异。 fastcall 与 stdcall 的考验就是这样。
根据我的阅读,这两种约定存在很大的混淆,64 位被标准化以避免这种混淆。
我不得不问,为什么选择fastcall?
另外,由于 fastcall 和 stdcall 是 win32 术语,那么 UNIX 术语中表示使用或不使用寄存器传递参数的函数调用是什么?
【问题讨论】:
-
这不完全是 fastcall,它是“我们还有 8 个寄存器,让我们使用 'em”调用约定。
-
@hansPassant 使用寄存器进行参数传递确实没有任何节省,因为您通常必须事先将寄存器备份到堆栈上。 Fastcall 风格的调用仅在非常特定的情况下更快。
-
您认为它们必须“备份”。一般来说,这不是一个正确的假设。代码生成器可以将它们视为临时文件或从内存中重新加载它们。 “让我们使用他们”方案不是“让我们全部使用”。
-
@hansPassant 点。我想我看到更多的问题是“被调用者”无论如何都需要使用寄存器并且必须在堆栈上备份 args,除非它是一个非常简单的函数。
-
没有“64 位快速调用”之类的东西。 fastcall 纯粹是旧 32 位 x86 的产物。
标签: unix 64-bit x86-64 stdcall fastcall