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

时间:2011-11-07 15:10:36

标签: clr calling-convention

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


This book excerpt声明:

  

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

1 个答案:

答案 0 :(得分:4)

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

这很昂贵,这就是Microsoft建议结构不应大于16个字节的原因。故意通过ref传递结构以避免复制是一种解决方法,通常也在C和C ++中完成。以额外的指针取消引用为代价。