如何在C#中生成多维数组的源代码

姆克蒂奇·马兹曼扬

例如我们有一个双精度的多维数组 double[,] d = new double[1,2];

d.GetType() 退货 {Name = "Double[,]" FullName = "System.Double[,]"}

d[0,0]编译为call instance float64 float64[0..., 0...]::Get(int32, int32)IL

类型的源代码如何System.Double[,]生成?它是用CLR烘焙的还是罗斯林负责其生成?

斯威克

数组类型由CLR以特殊方式处理(一维和多维数组,并且每个数组都以不同的特殊方式)。对于多维数组,Roslyn所做的只是callGet()方法,而CLR负责其余的工作。

CLR的确切工作非常复杂(至少在我看来是如此),但是我认为最相关的部分始于Lowering::LowerArrElem

最终结果是这样的方法:

[MethodImpl(MethodImplOptions.NoInlining)]
private static double Get(double[,] d)
{
    return d[0, 0];
}

编译为以下x64代码(我的评论):

// stack pointer adjustment, not interesting
sub         rsp,28h  

// eax = 0
xor         eax,eax  

// range check first dimension against eax
sub         eax,dword ptr [rcx+18h]  
cmp         eax,dword ptr [rcx+10h]  
jae         00007FFD0A554521  

// edx = 0
xor         edx,edx  

// range check second dimension against edx
sub         edx,dword ptr [rcx+1Ch]  
cmp         edx,dword ptr [rcx+14h]  
jae         00007FFD0A554521  

// compute item offset
mov         r8d,dword ptr [rcx+14h]  
imul        r8,rax  
mov         rax,rdx  
add         rax,r8  

// load result into xmm0
movsd       xmm0,mmword ptr [rcx+rax*8+20h]  

// stack pointer adjustment, not interesting
add         rsp,28h  

// return
ret

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章