Dlaczego pierwsza alokacja C++ (m) ma zawsze 72 KB?
Dowiedz się, dlaczego pierwsza alokacja pamięci C++ żąda 72 KB zamiast oczekiwanych bajtów. Zapoznaj się z objaśnieniami elementów wewnętrznych malloc i warstw zarządzania pamięcią systemu operacyjnego.
Mewayz Team
Editorial Team
Tajemnica Twojej pierwszej alokacji C++
Piszesz prosty program w C++. Pojedynczy nowy int. Cztery bajty. Uruchamiasz strace lub swój ulubiony program do profilowania pamięci i gotowe — Twój proces właśnie zażądał około 72 KB z systemu operacyjnego. Nie 4 bajty. Nie 64 bajty. Pełne 72 KB. Jeśli kiedykolwiek patrzyłeś na tę liczbę i zastanawiałeś się, czy Twoje narzędzia Cię okłamują, nie jesteś sam. To pozornie dziwaczne zachowanie jest jednym z najczęściej zadawanych pytań wśród programistów C++, którzy po raz pierwszy zagłębiają się w wewnętrzne elementy pamięci, a odpowiedź zabiera nas w fascynującą podróż przez warstwy znajdujące się pomiędzy kodem a rzeczywistym sprzętem.
Co się stanie, gdy zadzwonisz do nowego
Aby zrozumieć liczbę 72 KB, należy prześledzić pełny łańcuch alokacji. Kiedy kod C++ wykonuje polecenie new int, kompilator tłumaczy to na wywołanie operatora new, który w większości systemów Linux deleguje polecenie malloc z glibc. Ale malloc nie pyta bezpośrednio jądra o 4 bajty pamięci. Jądro działa na stronach — zazwyczaj 4 KB na x86_64 — a koszt wywołania systemowego jest ogromny w porównaniu z prostym dostępem do pamięci. Wywołanie brk() lub mmap() dla każdej indywidualnej alokacji spowodowałoby zatrzymanie dowolnego nietrywialnego programu.
Zamiast tego moduł alokacji pamięci glibc — implementacja zwana ptmalloc2, wywodząca się z klasycznego narzędzia dlmalloc Douga Lei — działa jako pośrednik. Żąda od jądra dużych bloków pamięci, a następnie dzieli je na mniejsze części, w miarę potrzeb programu. Jest to podstawowy powód, dla którego pierwsza alokacja 4 bajtów wyzwala znacznie większe żądanie do systemu operacyjnego. Alokator nie jest marnotrawstwem. To jest strategiczne.
Analiza 72 KB: dokąd idą bajty
Narzut związany z alokacją początkową pochodzi z kilku odrębnych komponentów, które środowisko wykonawcze musi zainicjować, zanim będzie mogło udostępnić Ci choćby jeden bajt użytecznej pamięci. Zrozumienie każdego składnika wyjaśnia, dlaczego liczba ląduje tam, gdzie się znajduje.
Po pierwsze, malloc glibc inicjuje główną arenę — podstawową strukturę księgową, która śledzi wszystkie alokacje w głównym wątku. Ta arena obejmuje metadane sterty, wskaźniki wolnej listy i struktury bin dla różnych rozmiarów alokacji. Alokator rozszerza przerwę w programie za pomocą sbrk(), a początkowym rozszerzeniem zarządza wewnętrzny parametr o nazwie M_TOP_PAD, który domyślnie wynosi 128 KB dopełnienia. Jednak rzeczywiste żądanie początkowe jest dostosowywane pod kątem wyrównania strony i istniejącej pozycji przerwania, co często skutkuje mniejszym pierwszym żądaniem — zwykle w przypadku świeżo rozpoczętego procesu rozmiar jest bliski wartości 72 KB.
💡 CZY WIESZ?
Mewayz replaces 8+ business tools in one platform
CRM · Fakturowanie · HR · Projekty · Rezerwacje · eCommerce · POS · Analityka. Darmowy plan dostępny na zawsze.
Zacznij za darmo →Po drugie, od wersji glibc 2.26, alokator inicjuje lokalną pamięć podręczną wątku (tcache) przy pierwszym użyciu. Tcache zawiera 64 pojemniki (po jednym na klasę wielkości małej alokacji), z których każdy może pomieścić do 7 fragmentów buforowanych. Sam tcache_perthread_struct zużywa około 1 KB, ale akt jego inicjalizacji uruchamia szerszą konfigurację areny. Po trzecie, środowisko wykonawcze C++ wykonało już alokacje, zanim w ogóle uruchomiła się funkcja main() — konstruktory statyczne, inicjalizacja bufora iostream dla std::cout i friends oraz konfiguracja ustawień regionalnych przyczyniają się do początkowego rozmiaru sterty.
System Arena i dlaczego wstępna alokacja jest inteligentna
Decyzja o wstępnym przydzieleniu znacznej części pamięci zamiast żądania jej fragmentarycznie nie jest dziełem przypadku. Jest to celowy kompromis inżynieryjny, zakorzeniony w dziesięcioleciach doświadczenia w programowaniu systemów. Każde wywołanie brk() lub mmap() wiąże się z przełączeniem kontekstu z przestrzeni użytkownika do przestrzeni jądra, modyfikacją mapowań pamięci wirtualnej procesu i potencjalnymi aktualizacjami tablic stron. Na nowoczesnym sprzęcie pojedyncze wywołanie systemowe kosztuje około 100–200 nanosekund – samo w sobie jest to trywialne, a na skalę katastrofalne.
Rozważmy program, który podczas inicjalizacji dokonuje 10 000 małych alokacji. Bez wstępnej alokacji oznaczałoby to 10 000 wywołań systemowych, co kosztowałoby około 1–2 milisekund czystego narzutu. W przypadku alokatora opartego na arenie, pierwszy wyzwalacz alokacji
Build Your Business OS Today
From freelancers to agencies, Mewayz powers 138,000+ businesses with 207 integrated modules. Start free, upgrade when you grow.
Create Free Account →Related Posts
- Archeolodzy odnajdują możliwy pierwszy bezpośredni dowód na słonie bojowe Hannibala
- KFC, Nando's i inne rezygnują z zobowiązań dotyczących dobrostanu kurczaków
- Brak umiejętności. Brak smaku
- IRS straciło 40% personelu IT, 80% liderów technologicznych w wyniku reorganizacji pod hasłem 'efektywności'
Frequently Asked Questions
Czym jest tak naprawdę ta alokacja 72 KB?
To nie jest alokacja twojego obiektu (np. `int`), ale inicjalizacja środowiska wykonawczego C++ (runtime). Biblioteka standardowa (np. libc, libstdc++) rezerwuje ten blok pamięci na start. Służy on jako "pulapka pamięci" dla małych alokacji, zarządza strukturami wewnętrznymi (jak stosy wyjątków czy tablice wskaźników funkcji) i ustawia menedżera sterty (heap). Dzięki temu kolejne, małe alokacje są szybsze, bo nie muszą za każdym razem pytać systemu operacyjnego o pamięć.
Czy mogę jakoś uniknąć tej alokacji?
Nie ma standardowego sposobu na całkowite jej uniknięcie, ponieważ jest niezbędna do poprawnego działania języka. Możesz jednak minimalizować całkowitą liczbę takich inicjalizacji, używając bibliotek zaprojektowanych pod kątem osadzonych systemów (embedded) lub łącząc się statycznie z biblioteką wykonawczą, co może zmienić charakter alokacji. Jednak dla typowych aplikacji jest to koszt, który należy zaakceptować.
Czy to zużywa 72 KB pamięci RAM przez cały czas życia programu?
Tak, ta pamięć jest zarezerwowana na stałe dla procesu. Chociaż jej część może być początkowo niezapisana, cały blok jest mapowany na pamięć fizyczną (lub swap) w momencie startu programu. Śledzenie takich wewnętrznych alokacji jest kluczowe w systemach o ograniczonych zasobach. Narzędzia do profilowania, takie jak te dostępne w ramach Mewayz (207 modułów, 19 USD/mies.), pomagają dokładnie zrozumieć takie zużycie pamięci przez twoją aplikację.
Czy inne języki programowania też tak robią?
Tak, wiele języków z zarządzaną pamięcią lub rozbudowanymi środowiskami wykonawczymi (runtime) wykazuje podobne zachowanie. Na przykład Java (JVM) czy Go alokują znaczną ilość pamięci przy starcie na swoje sterty (heaps) i struktury danych. Kluczowa różnica w C++ polega na tym, że ta alokacja jest bardziej bezpośrednio widoczna, gdy śledzimy wywołania systemowe, ponieważ biblioteka wykonawcza C++ jest zwykle częścią procesu.
Wypróbuj Mewayz za Darmo
Kompleksowa platforma dla CRM, fakturowania, projektów, HR i więcej. Karta kredytowa nie jest wymagana.
Zdobądź więcej takich artykułów
Cotygodniowe wskazówki biznesowe i aktualizacje produktów. Za darmo na zawsze.
Masz subskrypcję!
Zacznij dziś zarządzać swoją firmą mądrzej.
Dołącz do 30,000+ firm. Plan darmowy na zawsze · Bez karty kredytowej.
Gotowy, aby wprowadzić to w życie?
Dołącz do 30,000+ firm korzystających z Mewayz. Darmowy plan forever — karta kredytowa nie jest wymagana.
Rozpocznij darmowy okres próbny →Powiązane artykuły
Hacker News
Topologia algebraiczna: węzły, ogniwa i warkocze
Mar 10, 2026
Hacker News
Co zawsze chciałem wiedzieć o wartościach drugiej klasy
Mar 10, 2026
Hacker News
Jolla jest na dobrej drodze do dostarczenia nowego telefonu z systemem Sailfish OS i baterią wymienianą przez użytkownika
Mar 10, 2026
Hacker News
Inżynieria wsteczna protokołu Inform UniFi
Mar 10, 2026
Hacker News
Velxio, emulator Arduino
Mar 10, 2026
Hacker News
Pod koniec czerwca 2026 r. nie zostanie wprowadzona sekunda przestępna
Mar 10, 2026
Gotowy, by podjąć działanie?
Rozpocznij swój darmowy okres próbny Mewayz dziś
Platforma biznesowa wszystko w jednym. Karta kredytowa nie jest wymagana.
Zacznij za darmo →14-dniowy darmowy okres próbny · Bez karty kredytowej · Anuluj w dowolnym momencie