Я попытался выяснить, как закреплены указатели с помощью ключевого слова fixed
. Моя идея заключалась в том, что для этого был использован GCHandle.Alloc(object, GCHandleType.Pinned)
. Но когда я посмотрел на IL, сгенерированный для следующего кода С#:
unsafe static void f1()
{
var arr = new MyObject[10];
fixed(MyObject * aptr = &arr[0])
{
Console.WriteLine(*aptr);
}
}
Я не мог найти никаких следов GCHandle
.
Единственный намек, который я увидел, что приписанный указатель использовался в методе, был следующим объявлением IL:
.locals init ([0] valuetype TestPointerPinning.MyObject[] arr,
[1] valuetype TestPointerPinning.MyObject& pinned aptr)
Таким образом, указатель был объявлен как закрепленный, и для этого не требовались дополнительные вызовы методов.
Мои вопросы
- Есть ли разница между использованием закрепленных указателей в объявлении и фиксацией указателя с помощью
GCHandle
class? - Есть ли способ объявить привязанный указатель на С# без использования ключевого слова
fixed
? Мне нужно это, чтобы связать кучу указателей внутри цикла, и я не могу это сделать, используя фиксированное ключевое слово.