c#中的__fastcall约定

时间:2011-02-06 22:45:55

标签: c# c++ calling-convention

考虑到:

  

Microsoft特定

     

__fastcall调用约定   指定函数的参数   将在寄存器中传递   可能。以下列表显示了   执行此调用   约定。

并且寄存器中的读/写时间比堆栈中的更快,我们在C#中是否有任何__fastcall等价物?

3 个答案:

答案 0 :(得分:5)

不是直接的,C#主要使用的东西等同于MSVC ++的__stdcall约定。然而,它可以是“固定的”,但在relatively dirty way中(注意该示例适用于__cdecl)。

但是,这可能是最好的方式。在像C#这样的高级语言中(即使在大多数C ++程序中),这是编译器最好的优化。强制召唤惯例通常make things worse。即使它有所帮助,它通常也不会给你带来太多,至少在我使用它的C和C ++程序中。

答案 1 :(得分:4)

__ fastcall会自动使用,但仅限于某些条件。这是一篇关于这个主题的有趣文章:

  

2.方法中不应有超过七个参数。

     

背后的原因是.net   前两个参数更快   比最后两个参数。让我   更清楚地解释一下。在C#中   每当一个方法被称为   参数被推入堆栈,   然后由该方法使用。现在   微软的编译器(在X86中)有一个   高级优化技术称为   __FASTCALL,其中前两个   参数以as发送   寄存器。据说这些都有   成为注册的。好吧之后   注册,变量或   参数有快速推广   拥有独有的特权   存储在处理器中的速度最快   缓存。注意这通常是做到的   我们在循环期间使用的变量“i”   或迭代,由于它的访问   并且使用确实变得非常快。   因此,在编译期间的方法   被编译成本机代码   .Net运行时使用__FASTCALL动作   一种数量较少的方法   参数比优化更加优化   参数太多了。

Source

答案 2 :(得分:0)

LadaRaider,在32位Arch上,意思是“最大寄存器的最大大小是4字节”如果你通过一个需要8字节的“Long Long”,它将使用2个4字节的寄存器,这就是编译器处理的方式它。假设你只使用4个4字节的寄存器,所以,你不能传递2个“Long Long”变量,例如......有些数据必须进入更慢的内存。