我为什么不使用__fastcall而不是标准__cdecl?

时间:2012-10-26 15:21:56

标签: c++ c function-calls cdecl fastcall

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

我想知道是什么让__fastcall像C中的标准一样不受欢迎,何时我会在我的代码中使用它。

2 个答案:

答案 0 :(得分:10)

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

Win32 / x86,它在stdcall上标准化。调用约定之间存在各种权衡 - 在寄存器中放置参数的速度更快,但它会强制调用者溢出以前使用这些寄存器的任何内容。所以很难预测哪个会带来更好的性能。

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

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

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

Linux / x86也有一个约定。

答案 1 :(得分:3)

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

但是对于fastcall:据我记忆,它不是标准化的,因此不适合库代码。这里有很好的概述:Calling Conventions Demystified

相关问题