Używam głównie menedżera pamięci O (1) małego bloku (SBMM). Zasadniczo działa to w następujący sposób:
1) Przydziela większe superbloki z systemu operacyjnego i śledzi adresy początkowy i końcowy jako zakres. Rozmiar SuperBlock jest regulowany, ale 1 MB ma całkiem niezły rozmiar.
2) SuperBlocks są podzielone na Bloki (również regulowane w rozmiarach ... 4K-64K jest dobre w zależności od aplikacji). Każdy z tych bloków obsługuje alokacje o określonym rozmiarze i przechowuje wszystkie elementy w bloku jako pojedynczo połączoną listę. Po przydzieleniu SuperBlock tworzysz listę darmowych bloków.
3) Przydzielenie przedmiotu oznacza A) Sprawdzenie, czy istnieje Blok z Wolnymi Przedmiotami, który obsługuje ten rozmiar - a jeśli nie, przydzielenie nowego Bloku z SuperBlocków. B) Usuwanie przedmiotu z wolnej listy bloku.
4) Zwolnienie pozycji po adresie oznacza A) Znalezienie SuperBlock zawierającej adres (*) B) Odnalezienie bloku w SuperBlock (odejmowanie adresu początkowego SuperBlock i dzielenie według rozmiaru bloku) C) Przesunięcie elementu z powrotem na listę Wolnego przedmiotu bloku.
Jak stwierdziłem, ten SBMM jest bardzo szybki, ponieważ działa z wydajnością O (1) (*). W wersji, którą zaimplementowałem, używam AtomicSList (podobnego do SLIST w Windows), aby była to nie tylko wydajność O (1), ale także ThreadSafe i LockFree w implementacji. Możesz faktycznie zaimplementować algorytm za pomocą Win32 SLIST, jeśli chcesz.
Co ciekawe, algorytm alokacji bloków z SuperBlocks lub Elementów z Blocks daje prawie identyczny kod (oba są przydziałami O (1) poza Wolną Listą).
(*) SuperBloki są rozmieszczone w ramce o średniej (O) (O) średniej wydajności (ale potencjalny O (Lg N) dla najgorszego przypadku, gdzie N to liczba SuperBlocków). Szerokość rangemap zależy od znajomości w przybliżeniu, ile pamięci będziesz potrzebować, aby uzyskać wydajność O (1). Jeśli przeregulujesz, zmarnujesz trochę pamięci, ale nadal uzyskasz wydajność O (1). Jeśli wykonasz undershoot, osiągniesz O (Lg N), ale N będzie dla SuperBlock - nie liczy się przedmiot. Ponieważ liczba SuperBlock jest bardzo niska w porównaniu do liczby Przedmiotów (o około 20 binarnych rzędów wielkości w moim kodzie), nie jest tak krytyczna jak reszta alokatora.
Tak. Prawdopodobnie osiągnęłbym 4-bajtową ziarnistość, ale to brzmi jak to, czego potrzebuję. Więc można to zrobić z całkowicie bez nagłówków, prawda? – Menkboy
Tak, nie są potrzebne nagłówki. Przydzielony blok nie potrzebuje nagłówka, a wolny blok potrzebuje tylko wskaźnika do następnego wolnego bloku. –
Słodki. Przypuszczalnie GCing to odzyskanie pamięci byłoby bólem głowy, ale zobaczę, czy uda mi się uciec, po prostu unikając tego, a może spróbuję zrobić to stopniowo. – Menkboy