11

我会听一些人说它比其他调用__fastcall更快__cdecl__stdcall因为它将两个参数放入寄存器,而不是其他调用之一;但是,另一方面,这不是 C 中使用的标准。

我想知道是什么让__fastcallC 中的标准变得不受欢迎,以及何时在我的代码中使用它。

4

2 回答 2

11

x86 平台的不寻常之处在于它没有定义全局 ABI 和调用约定。

Win32/x86 可以,它在stdcall. 调用约定之间存在各种权衡——将参数放在寄存器中更快,但它会迫使调用者溢出以前使用这些寄存器的任何内容。所以很难预测哪个性能更好。

重要的是要有一个统一的标准调用约定,以实现不同编译器(甚至不同编程语言)之间的互操作性。

其他平台没有cdeclstdcallfastcall约定。它们没有相同的寄存器集。在某些情况下,他们甚至根本没有寄存器。但他们仍然可以使用 C 代码。

Win32/x86_64 不使用stdcall,它使用体系结构定义的约定。

Linux/x86 也有一个约定。

于 2012-10-26T15:31:02.850 回答
4

您是否正在寻找为库接口指定的调用约定?因为对于所有其他函数,我根本不会指定调用约定。编译器的优化过程(例如自动内联)可能会使调用约定无用。

但是关于fastcall:据我记得,它不是标准化的,因此不适合库代码。这是一个很好的概述:调用约定揭秘

于 2012-10-26T15:31:34.087 回答