Сообщение Re[2]: крепостные объекты от 07.03.2024 12:07
Изменено 07.03.2024 12:15 m2user
Re[2]: крепостные объекты
S>Пользоваться им напрямую я крайне не рекомендую. Сначала нужно очень хорошо разобраться, что это, в каких случаях его надо использовать, какие там ограничения и прочее. Неаккуратное применение пришпиливания помешает GC и вообще приведёт к нестабильной работе вашей программы.
ReadOnlyMemory появился только в свежих версиях .NET. А до этого всё спокойно делалось через GCHandle.Alloc(..., GCHandleType.Pinned).
И ничего сложного в нем нет, если побитовая совместимость гарантирована.
S>Ускорение происходит не за счёт самого пришпиливания как такового (как раз наоборот — GC не может свободно распоряжаться пришпиленной памятью, поэтому ему придётся делать всякие приседания, увеличивая расход памяти и время сборки мусора), а за счёт того, что можно отказаться от лишних копирований.
Ещё и код становится проще, т.к. нужно вручную unmanaged память выделять/копировать/освобождать.
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).
И ничего сложного в нем нет, если побитовая совместимость гарантирована.
S>Ускорение происходит не за счёт самого пришпиливания как такового (как раз наоборот — GC не может свободно распоряжаться пришпиленной памятью, поэтому ему придётся делать всякие приседания, увеличивая расход памяти и время сборки мусора), а за счёт того, что можно отказаться от лишних копирований.
Ещё и код становится проще, т.к. не нужно вручную unmanaged память выделять/копировать/освобождать.
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 память выделять/копировать/освобождать.