Wielu z Was kojarzy zapewne konstrukcję unsafe do deklarowania stref niezarządzanych w których możemy np. wykorzystywać wskaźniki i inne mechanizmy znane z języków niezarządzanych. Słowo fixed wydaje mi się, że jest nieco mniej popularne.
Wiemy, że w środowisku .NET, gdzie zasoby pamięci zarządzane są przez Garbage Collector, obiekty mogą zmieniać swój adres. W poprzednich postach (o GC) pisałem, że przy zwolnieniu obiektów, wszystkie pozostałe są szeregowane jeden po drugim, tak aby uniknąć problemów związanych z fragmentacją – nowe obiekty zawsze są doczepiane na końcu. Sam ten fakt, udowadnia, że nie możemy polegać na czystych wskaźnikach. Wyobraźmy sobie taką konstrukcję:
MyClass myClass = new MyClass(); unsafe { int* pointer = &myClass.Age; //Age - pole typu int }
Powyższy kod z pewnością nie jest poprawny dla .NET. MyClass nie ma stałego adresu, w każdym momencie może zostać przeniesiony przez GC i po pewnym czasie zmienna pointer będzie wskazywała na coś innego. Rozwiązaniem jest oczywiście słowo fixed:
MyClass myclass = new MyClass(); unsafe { fixed(int* field = &myclass.Age) { } }
Fixed nakazuje GC, aby adres był stały, ustalony z góry. Dzięki temu możemy w bezpieczny sposób odwoływać się do wskaźnika – mamy pewność, że nie zostanie zmieniony.
cześć, rodzi się więc pytanie:
czy zastosowanie klauzuli “fixed” ma niekorzystny wpływ na procesy realizowane przez GC?
Podejrzewam że zależy ile tych “fixów” użyjemy ale ponieważ nigdy nie korzystałem z tego typu konstrukcji to pytam specjalisty 🙂
@noname
Wydaje mi się, że wchodząc w blok kodu “unsafe” programista dokładnie wie co chce zrobić i jakie zalety tegoż bloku wykorzystuje. Co za tym idzie zdaje sobie sprawę, że używanie fixów może zmniejszyć efektywność pracy GC (choćby wymuszając defragmentację), ale korzyści wybitnie przeważą. Typowym, sztandarowym przykładem jest praca z bitmapami, która jest dużo efektywniejsza jako “unsafe” i nawet niekorzystny wpływ na GC tego nie zmieni 🙂
Wydajność spadnie – dokładnych liczb jednak nie jestem w stanie podać. Pewne jest, że fixed jest używane bardzo rzadko i jeśli znajdziesz taki przykład to należy go uważnie rozważyć.
To, że istnieje fixed nie znaczy, że mamy używać unsafe+fixed – grupa docelowa jest naprawdę wąska.
A ja twierdzę, że wydajność nie spadnie, ponieważ fixed używa się w przypadkach, gdzie daje ono wymierną korzyść 🙂