Двойные указатели массива в CIL

1

Я играю с кодом и указателями CIL, и до сих пор я это понимаю, но есть что-то странное.
Рассмотрим этот код С#:

double* a = stackalloc double[3];   
a[1] = 2;
a[2] = 3;

Используя LINQPad, я получаю этот код IL для назначения переменных:

IL_000C:  ldloc.0     // a
IL_000D:  ldc.i4.8    
IL_000E:  conv.i      
IL_000F:  add         
IL_0010:  ldc.r8      00 00 00 00 00 00 00 40 
IL_0019:  stind.r8    

IL_001A:  ldloc.0     // a
IL_001B:  ldc.i4.s    10 
IL_001D:  conv.i      
IL_001E:  add         
IL_001F:  ldc.r8      00 00 00 00 00 00 08 40 
IL_0028:  stind.r8    

В первый раз он добавляет 8 к указателю, который я предполагаю, это длина двойного (8 байтов), чтобы перейти к индексу 1.
Но второй раз он добавляет 10, что не имеет для меня смысла. Может ли кто-нибудь объяснить мне, почему он использует 10? Спасибо.

  • 1
    10 или 0x10? например, 16
  • 0
    @JamesBarrass, дорогой ... это имеет смысл. и 0x18 - это 24 для индекса 3 ... Спасибо!
Показать ещё 4 комментария
Теги:
pointers
cil

1 ответ

0

Как правильно указал Джеймс Баррасс, значения, показанные ildasm, равны шестиугольнику. 10 означает 0x10 = 16.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню