2011/02/06 追記: 実行環境下では JIT 最適化で、関係なくなるようだ。
C# では、*p++ は使わないほうがいい。
*p; p++; に分解すること。
Visual Studio 2010 version 10.0.30319.1
.Net Framework 4.0.30319
の話。/unsafe な release ビルド(最適化ON)。
volatile int r;
int[] a;
...
unsafe {
fixed (int* a0 = a) {
int* p = a0;
...
r = *p++;
...
の逆アセンブルウィンドウでの結果。
r = *p++;
0000008f mov eax,dword ptr [ebp-8]
00000092 mov dword ptr [ebp-10h],eax
00000095 add dword ptr [ebp-8],4
00000099 mov eax,dword ptr [ebp-10h]
0000009c mov eax,dword ptr [eax]
0000009e mov dword ptr ds:[007716C0h],eax
[ebp-10h]は一時変数。かなり間抜けだ。
r = *p++;
を
r = *p;
p++;
に分けると、こうなる。
r = *p;
0000008f mov eax,dword ptr [ebp-8]
00000092 mov eax,dword ptr [eax]
00000094 mov dword ptr ds:[005B16C0h],eax
p++;
00000099 add dword ptr [ebp-8],4