我会听一些人说它比其他调用__fastcall
更快__cdecl
,__stdcall
因为它将两个参数放入寄存器,而不是其他调用之一;但是,另一方面,这不是 C 中使用的标准。
我想知道是什么让__fastcall
C 中的标准变得不受欢迎,以及何时在我的代码中使用它。
我会听一些人说它比其他调用__fastcall
更快__cdecl
,__stdcall
因为它将两个参数放入寄存器,而不是其他调用之一;但是,另一方面,这不是 C 中使用的标准。
我想知道是什么让__fastcall
C 中的标准变得不受欢迎,以及何时在我的代码中使用它。
x86 平台的不寻常之处在于它没有定义全局 ABI 和调用约定。
Win32/x86 可以,它在stdcall
. 调用约定之间存在各种权衡——将参数放在寄存器中更快,但它会迫使调用者溢出以前使用这些寄存器的任何内容。所以很难预测哪个性能更好。
重要的是要有一个统一的标准调用约定,以实现不同编译器(甚至不同编程语言)之间的互操作性。
其他平台没有cdecl
、stdcall
或fastcall
约定。它们没有相同的寄存器集。在某些情况下,他们甚至根本没有寄存器。但他们仍然可以使用 C 代码。
Win32/x86_64 不使用stdcall
,它使用体系结构定义的约定。
Linux/x86 也有一个约定。
您是否正在寻找为库接口指定的调用约定?因为对于所有其他函数,我根本不会指定调用约定。编译器的优化过程(例如自动内联)可能会使调用约定无用。
但是关于fastcall:据我记得,它不是标准化的,因此不适合库代码。这是一个很好的概述:调用约定揭秘