fastcall调用约定是否真的比其他调用约定更快,例如cdecl?是否有任何基准测试表明调用约定会影响性能?
这取决于平台.例如,对于Xenon PowerPC,由于在堆栈上传递数据的加载命中存储问题,它可能是一个数量级的差异.我在经验上将cdecl
函数的开销定时为大约45个周期,相比之下,大约为4个周期fastcall
.
对于无序的x86(Intel和AMD),影响可能会小得多,因为无论如何寄存器都被遮蔽并重命名.
答案实际上是你需要在你关心的特定平台上自己进行基准测试.
fastcall调用约定是否真的比其他调用约定更快,例如cdecl?
我相信fastcall
在x86和x64上的微软实现涉及将前两个参数传递给寄存器而不是堆栈.
由于它通常可以节省至少四次内存访问,是的,它通常更快.但是,如果所涉及的功能是寄存器缺乏的,因此无论如何都可能将它们写入堆栈中的本地,那么就不可能有显着的增加.
调用约定(至少在x86上)并没有太大的速度差异.在Windows中,它_stdcall
是默认的,因为它为非平凡程序产生了切实的结果,因为它通常会导致较小的代码大小_cdecl
._fastcall
不是默认值,因为它所产生的差异远没有那么明显.你在通过寄存器传递的参数中弥补了你在效率较低的函数体中丢失的东西(如前面Anon所述).如果被调用函数需要立即将所有内容溢出到内存中以进行自己的计算,则不会通过传入寄存器获得任何内容.
但是,我们可以整天兜售理论创意 - 为您的代码提供正确答案的基准._fastcall
在某些情况下会更快,而在其他情况下会更慢.
在现代x86 - 没有.在L1缓存和内部之间没有快速呼叫的地方.