例如我们有一个双精度的多维数组 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所做的只是call
该Get()
方法,而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] 删除。
我来说两句