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% 向上するようですが、その理由がわかりません。これらの 2 つの行はまったく同じことをしていませんか?
ありがとう!
編集: [64 ビット リリース モード] バイトコードは、リリース モードでコンパイルした場合と同じように見えます。パフォーマンス測定はリリース モードで少し前に行われました。