Malloc a niestandardowy alokator: Malloc ma dużo narzutów. Czemu?

Mam aplikację do kompresji obrazów, która ma teraz dwie różne wersje systemów alokacji pamięci. W oryginalnym malloc jest używany wszędzie, aw drugim zaimplementowałem prosty alokator puli, który po prostu przydziela część pamięci i zwraca części tej pamięci do wywołań myalloc ().

Zauważyliśmy ogromne obciążenie pamięci, gdy używany jest malloc: w szczytowym momencie używania pamięci kod malloc () wymaga około 170 megabajtów pamięci na obraz 1920x1080x16bpp, podczas gdy alokator puli przydziela tylko 48 megabajtów, z czego 47 są używane przez program.

Jeśli chodzi o wzorce alokacji pamięci, program przydziela obrazowi testowemu wiele bloków 8-bajtowych (większość), 32-bajtowych (wiele) i 1080-bajtowych (niektóre). Poza tym w kodzie nie ma dynamicznych alokacji pamięci.

OS systemu testowego to Windows 7 (64 bity).

Jak przetestowaliśmy użycie pamięci?

Za pomocą niestandardowego alokatora można było zobaczyć, ile pamięci jest używane, ponieważ wszystkie wywołania malloc są zablokowane w alokatorze. W malloc () w trybie debugowania przeszliśmy przez kod i obserwowaliśmy wykorzystanie pamięci w menedżerze zadań. W trybie wydania zrobiliśmy to samo, ale mniej drobnoziarniste, ponieważ kompilator optymalizuje wiele rzeczy, więc nie mogliśmy przejść przez kawałek kodu po kawałku (różnica pamięci między wydaniem a debugowaniem wynosiła około 20 MB, co przypisałbym optymalizacja i brak informacji debugowania w trybie zwolnienia).

Czy sam malloc może być przyczyną tak dużego obciążenia? Jeśli tak, co dokładnie powoduje ten narzut wewnątrz malloc?

questionAnswers(3)

yourAnswerToTheQuestion