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