考虑到:
Microsoft特定
__fastcall调用约定 指定函数的参数 将在寄存器中传递 可能。以下列表显示了 执行此调用 约定。
并且寄存器中的读/写时间比堆栈中的更快,我们在C#中是否有任何__fastcall等价物?
答案 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动作 一种数量较少的方法 参数比优化更加优化 参数太多了。
答案 2 :(得分:0)
LadaRaider,在32位Arch上,意思是“最大寄存器的最大大小是4字节”如果你通过一个需要8字节的“Long Long”,它将使用2个4字节的寄存器,这就是编译器处理的方式它。假设你只使用4个4字节的寄存器,所以,你不能传递2个“Long Long”变量,例如......有些数据必须进入更慢的内存。