JIT-оптимизация индексатора, который модифицируется только последовательно.

StackOverflow https://stackoverflow.com/questions/1658825

  •  11-09-2019
  •  | 
  •  

Вопрос

Мне интересно, что происходит в этой ситуации:

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

Предполагая, что это единственный способ i используется в методе, удаляет ли JIT i и заменить его буквальными значениями?

Это было полезно?

Решение

Сгенерированный код (x86) выглядит следующим образом:

            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 выглядит аналогично.Это также не оптимизирует переменную.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top