none
C#编译器对 -> 操作符的编译 RRS feed

  • 问题

  • 现在我编译了下面一个方法:
    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指令?
    2013年1月4日 10:22

全部回复