MSIL чистого C ++ / CLI - PullRequest
       18

MSIL чистого C ++ / CLI

3 голосов
/ 28 октября 2011
Переключатель

/clr:pure генерирует чистый MSIL, но его невозможно проверить. В этом режиме можно использовать собственный массив и указатель. Означает ли это, что в MSIL есть структура для хранения собственных массивов и указателей? Если да, я хотел бы спросить, как я могу кодировать собственный массив и указатель MSIL?

1 Ответ

4 голосов
/ 29 октября 2011

Да, в CIL есть тип для представления неуправляемых указателей.Они аналогичны управляемым указателям (ref и out в C #, & в CIL), за исключением того, что GC игнорирует их и вы можете выполнять над ними некоторые арифметические операции (те, которые имеют смысл с указателями).

Интересно, что тип указателя содержит информацию о целевом типе (например, int32*), но все арифметические операции основаны на байтах.

Например, следующий метод C ++ / CLI:

void Bar(int *a)
{
    a[5] = 15;
}

создает следующий CIL, когда он находится внутри ref class (как сообщает Reflector):

.method private hidebysig instance void Bar(int32* a) cil managed
{
    .maxstack 2
    L_0000: ldarg.1      // load the value of a pointer to the stack
    L_0001: ldc.i4.s 20  // load the number 20 (= 4 * 5) to the stack
    L_0003: add          // add 20 to the pointer
    L_0004: ldc.i4.s 15  // load the number 15 to the stack
    L_0006: stind.i4     // store the value of 15 at the computed address
    L_0007: ret          // return from the method
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...