Re[2]: крепостные объекты
От: m2user  
Дата: 07.03.24 12:07
Оценка:
S>Пользоваться им напрямую я крайне не рекомендую. Сначала нужно очень хорошо разобраться, что это, в каких случаях его надо использовать, какие там ограничения и прочее. Неаккуратное применение пришпиливания помешает GC и вообще приведёт к нестабильной работе вашей программы.

ReadOnlyMemory появился только в свежих версиях .NET. А до этого всё спокойно делалось через GCHandle.Alloc(..., GCHandleType.Pinned).
И ничего сложного в нем нет, если побитовая совместимость гарантирована.

GCHandle gch = new GCHandle();
try {
 gch = GCHandle.Alloc(..., GCHandleType.Pinned);
 SomeExternalMethod(gch.AddrOfPinnedObject())
} finally {
 if (gch.IsAllocated){
  gch.Free();
 }
}


S>Ускорение происходит не за счёт самого пришпиливания как такового (как раз наоборот — GC не может свободно распоряжаться пришпиленной памятью, поэтому ему придётся делать всякие приседания, увеличивая расход памяти и время сборки мусора), а за счёт того, что можно отказаться от лишних копирований.


Ещё и код становится проще, т.к. не нужно вручную unmanaged память выделять/копировать/освобождать.
Отредактировано 07.03.2024 12:15 m2user . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.