Информация об изменениях

Сообщение Re[2]: крепостные объекты от 07.03.2024 12:07

Изменено 07.03.2024 12:15 m2user

Re[2]: крепостные объекты
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 память выделять/копировать/освобождать.
Re[2]: крепостные объекты
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 память выделять/копировать/освобождать.