2009-11-01 69 views
0

我很好奇,在這種情況下會發生什麼:JIT優化它僅修改sequentaly

int i = 0; 
MessageBox.Show(i++.ToString()); 
MessageBox.Show(i++.ToString()); 
Array[i++] = Foo; 

假設這是在該方法中使用的唯一途徑i,莫非是JIT帶出i並用文字值替換它?

回答

2

生成的代碼(86)是這樣的:

  int i = 0; 
0000004c xor   edx,edx 
0000004e mov   dword ptr [ebp-4Ch],edx 
      MessageBox.Show(i++.ToString()); 
00000051 mov   eax,dword ptr [ebp-4Ch] 
00000054 mov   dword ptr [ebp-54h],eax 
00000057 inc   dword ptr [ebp-4Ch] 
0000005a mov   eax,dword ptr [ebp-54h] 
0000005d mov   dword ptr [ebp-50h],eax 
00000060 lea   ecx,[ebp-50h] 
00000063 call  68C6F120 
00000068 mov   dword ptr [ebp-58h],eax 
0000006b mov   ecx,dword ptr [ebp-58h] 
0000006e call  67B5DC98 
00000073 nop    
      MessageBox.Show(i++.ToString()); 
00000074 mov   eax,dword ptr [ebp-4Ch] 
00000077 mov   dword ptr [ebp-5Ch],eax 
0000007a inc   dword ptr [ebp-4Ch] 
0000007d mov   eax,dword ptr [ebp-5Ch] 
00000080 mov   dword ptr [ebp-50h],eax 
00000083 lea   ecx,[ebp-50h] 
00000086 call  68C6F120 
0000008b mov   dword ptr [ebp-60h],eax 
0000008e mov   ecx,dword ptr [ebp-60h] 
00000091 call  67B5DC98 
00000096 nop    
      array[i++] = Foo; 
00000097 mov   eax,dword ptr [ebp-4Ch] 
0000009a mov   dword ptr [ebp-64h],eax 
0000009d inc   dword ptr [ebp-4Ch] 
000000a0 mov   eax,dword ptr [ebp-64h] 
000000a3 mov   edx,dword ptr [ebp-44h] 
000000a6 cmp   eax,dword ptr [edx+4] 
000000a9 jb   000000B0 
000000ab call  697AB2C4 
000000b0 mov   ecx,dword ptr [ebp-48h] 
000000b3 mov   dword ptr [edx+eax*4+8],ecx 

所以,無JIT不會優化掉的變量或它的變化。

x64代碼看起來很相似。這也沒有優化變量。