CLR/Fastcall:大值类型如何在内部传递给被调用函数?

发布于 2024-12-14 06:13:58 字数 364 浏览 2 评论 0原文

只是出于好奇:值类型通常是复制的,并且 JIT 编译器在调用方法时似乎使用 Microsoft 的 Fastcall 调用约定。这会将前几个参数放入寄存器中,以便快速访问。但是大值类型(即大于寄存器的大小或堆栈的宽度)如何传递给被调用的函数?


本书摘录指出:

CLR 的即时代码使用 fastcall Windows 调用约定。这允许调用者在机器的 ECX 和 EDX 寄存器中提供前两个参数(在实例方法的情况下包括 this)。

Just out of curiosity: value types are generally copied, and the JIT compiler seems to use Microsoft's Fastcall calling convention when calling a method. This puts the first few arguments in registers, for fast access. But how are large value types (i.e. bigger than the size of a register or the width of the stack) passed to the called function?


This book excerpt states that:

The CLR's jitted code uses the fastcall Windows calling convention. This permits the caller to supply the first two arguments (including this in the case of instance methods) in the machine's ECX and EDX registers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜味超标? 2024-12-21 06:13:58

它是__clrcall,确实类似于__fastcall。 x86 抖动使用两个寄存器(ecx、edx)。 x64 抖动的四个寄存器(ecx、edx、r8、r9),与本机 x64 调用约定相同。像 Decimal 和大型结构这样的大值类型是通过在调用者堆栈上保留空间、将值复制到其中并传递指向此副本的指针来传递的。被调用者再次将其复制到自己的堆栈帧中。

这是昂贵的,这就是为什么 Microsoft 建议结构体不应大于 16 字节。有意通过 ref 传递结构以避免复制是一种解决方法,通常在 C 和 C++ 中这样做。以额外的指针取消引用为代价。

It is __clrcall, indeed similar to __fastcall. Two registers are used by the x86 jitter (ecx, edx). Four registers by the x64 jitter (ecx, edx, r8, r9), same as the native x64 calling convention. Large value types like Decimal and large structs are passed by reserving space on the caller's stack, copying the value into it and passing a pointer to this copy. The callee copies it again to its own stack frame.

This is expensive which is why Microsoft recommends that a struct should not be larger than 16 bytes. Intentionally passing a struct by ref to avoid the copy is a workaround, commonly done in C and C++ as well. At the cost of an extra pointer dereference.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文