4

考虑到:

微软特定

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

而且寄存器中的读/写时间比堆栈中的快得多,我们在 C# 中是否有任何 __fastcall 等效项?

4

3 回答 3

5

不是直接的,C# 主要使用与 MSVC++ 的 __stdcall 约定等效的内容。然而,它可以被“修复”,尽管是以一种相对肮脏的方式(注意这个例子是针对 __cdecl 的)。

不过,这种方式可能是最好的。在像 C# 这样的高级语言中(哎呀,即使在大多数 C++ 程序中),这是最好留给编译器的优化。强制调用约定通常会使事情变得更糟。即使它有帮助,它通常也不会给你带来太多好处,至少在我使用它的 C 和 C++ 程序中是这样。

于 2011-02-06T23:08:22.143 回答
4

__fastcall 会自动使用,但仅在特定条件下使用。这是一篇关于这个主题的有趣文章:

2.一个方法中的参数不超过七个。

背后的原因是在.net中前两个参数比后两个参数快。让我解释一下。在 C# 中,每当调用方法时,参数都会被压入堆栈,然后由方法使用。现在微软的编译器(在 X86 中)有一种称为 __FASTCALL 的高级优化技术,其中前两个参数作为寄存器发送。现在据说这些已经注册。注册后,变量或参数具有快速通道提升,具有存储在处理器最快缓存中的专有特权。请注意,这通常是对我们在循环或迭代期间使用的变量“i”进行的,因此它的访问和使用确实变得非常快。因此,

来源

于 2011-02-06T23:00:28.427 回答
0

LadaRaider,在 32 位 Arch 上,这意味着“最大寄存器的最大大小为 4 字节”,如果您传递一个占用 8 个字节的“Long Long”,它将使用 2 个 4 字节的寄存器,这就是编译器处理它的方式。假设您只能使用 3 个 4 字节的寄存器,因此,例如,您不能传递 2 个“Long Long”变量……一些数据必须进入慢得多的内存。

于 2011-02-27T22:23:09.980 回答