【问题标题】:Any real use case for using the calling convention fastcall?使用调用约定 fastcall 的任何实际用例?
【发布时间】:2011-03-01 13:06:53
【问题描述】:

您有任何使用调用约定 fastcall 的实际用例吗?

谢谢。

【问题讨论】:

  • 显然它更快,因此更好;)。
  • 参见@luvieere 参考文章:它并不快... :)

标签: c++ stack calling-convention


【解决方案1】:

我有一个案例可以有效地使用它 - 它是一个非常小的 asm 例程(3 条指令),它操作寄存器中的单个值。

除了最小和最关键的例程之外,调用约定应该没有什么区别。

【讨论】:

    【解决方案2】:

    __fastcall 尽量在 CPU 寄存器中而不是堆栈中传递函数参数,这样会更快。

    这是 MSDN 文章的链接,该文章解释了 __fastcall 调用约定: http://msdn.microsoft.com/en-us/library/6xa169sk(VS.71).aspx

    前两个 DWORD 或更小 参数在 ECX 和 EDX 中传递 寄存器;所有其他论点都是 从右到左传递。

    这意味着这仅适用于前两个参数,并且仅适用于 总的来说,我会说,不要指望这有什么大的性能优势。

    【讨论】:

      【解决方案3】:

      Here 是一篇解释何时使用 fastcall 的文章。它实际上指定了一种情况,您实际上别无选择,只能使用它:

      一些 VCL 类,例如 TList,允许 您指定一个回调函数(一个 在 TList 的情况下排序例程)。 您将不得不使用 __fastcall 在这种情况下,关键字也是 VCL 期待它。

      【讨论】:

      • 谢谢。作为旁注:在您的文章中,在“__fastcall 真的很快吗?”部分:“我的测试的底线是,Register 调用约定并不比 C 调用约定快,而且在大多数情况下,速度更慢。当然,时间差异很小,但我向自己证明了它会是__fastcall 的支持者很难声称 Register 调用约定比任何其他约定都快”...“重复我已经说过的话,我建议您不要使用 __fastcall,除非它特别需要”:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2022-11-03
      • 2018-04-18
      • 2016-10-27
      • 2019-12-17
      相关资源
      最近更新 更多