Я играю с кодом и указателями 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? Спасибо.
Как правильно указал Джеймс Баррасс, значения, показанные ildasm, равны шестиугольнику. 10
означает 0x10 = 16.