现在我编译了下面一个方法:
unsafe void Operation()
{
DrawPoint[] a = new DrawPoint[200];
//在这里我进行了一些操作
fixed(DrawPoint* point = a)
{
DrawPoint* p = point + 5
if (p -> a)
{
//一些操作
}
}
}
其中DrawPoint是一个非托管结构,包含一个名为a的bool类型的字段,用ildasm查看编译后的il代码时发现实际上p -> a表达式编译为先用ldloc指令把局部变量p加载到堆栈,再用ldobj指令把整个结构加载到堆栈,最后用ldfld指令把字段a加载到堆栈。而按照Ecma-335中说明,可以直接把指针p作为ldfld指令的输入,没有必要先把整个结构加载到堆栈。请问为什么要多加一个ldobj指令?