我听到一些人说__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
,而是使用64位扩展的fastcall
。
Linux/x86也有自己的调用规则。
fastcall
。MSVC可以,其他编译器支持GNU C __attribute__((fastcall))
。顺便说一句,你链接的文章展示了调试模式下的汇编代码。难怪他们没有发现它更快;被调用者正在将寄存器参数溢出到堆栈中,然后重新加载它们,完全违背了与lea
/ ret
相比的目的。(它还声称MS保留更改fastcall以使用不同寄存器的权利。如果这是真的,那么它将不适用于库,但我不知道是否是真的。) - Peter Cordes