Как правильно обращаться к закрепленной памяти и управлять ею с помощью GCHandle.Allo c ()? - PullRequest
2 голосов
/ 19 января 2020

Я пытаюсь лучше понять, что нужно для закрепления памяти на более длительные периоды времени. Ясно, что GCHandle.Alloc(..., GCHandleType.Pinned) - это то, что мне нужно использовать (более fixed(){}).

Однако я надеялся, что смогу немного разъяснить его использование.

Если я выделю массив, а затем использую GCHandle, чтобы закрепить его:

byte[] data = new byte[10];
GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);

и если я манипулирую массивом data следующим образом:

for(int i = 0; i < data.length; i++) {
    data[i] = i;
}

продолжаю ли я работать с закрепленной областью памяти? Или я могу получить доступ к этой памяти только через функцию handle.AddrOfPinnedObject()?

Я уверен, что это, вероятно, довольно простой вопрос c, но любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 19 января 2020

Объект original остается действительным для использования - поскольку он все еще именуется данной переменной, продолжайте использовать его. Новый объект не создан, а существующий объект не признан недействительным. Итак, да, код будет «работать с закрепленной областью памяти».

Поведение GCHandle.Alloc(.., GCHandleType.Pinned):

  • Объект не может быть G C 'ed до вызова Free, , даже если он больше не доступен. Это может вызвать [истинную] утечку памяти, если дескриптор «забыт».

  • Объект не может быть перемещен во время цикла сжатия G C, а также не может быть перемещен между G C поколений. Это может привести к снижению производительности / эффективности G C.

...