使用 64 位大小的结构时,以下代码片段
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 8)]
unsafe struct BUF
{
}
((BUF*)dst) = *((BUF*)src);
生产
IL_0046: nop
IL_0047: ldloc.s dst
IL_0049: ldloc.2
IL_004a: ldobj MyClass/BUF
IL_004f: stobj MyClass/BUF
但是,当仅使用 long 时,以下代码会产生
*((long*)dst) = *((long*)src);
产生:
IL_0046: nop
IL_0047: ldloc.s dst
IL_0049: ldloc.2
IL_004a: ldind.i8
IL_004b: stind.i8
有谁知道 ldobj/stobj 和 ldind.i8/stind.i8 对于这个例子有什么不同(如果有的话)?
ldobj/stobj 似乎提高了 20% 的性能,但我不知道为什么会这样。这两条线不是在做完全相同的事情吗?
谢谢!
编辑:[64 位发布模式] 在发布模式下编译时,字节码看起来相同。性能测量是不久前在发布模式下完成的。