Hvorfor er den første C++ (m)allokeringen alltid 72 KB?
Oppdag hvorfor din første C++-minnetildeling ber om 72 KB i stedet for de forventede bytene. Utforsk malloc internals og OS-minneadministrasjonslag forklart.
Mewayz Team
Editorial Team
Mysteriet bak din første C++-tildeling
Du skriver et enkelt C++-program. En enkelt ny int. Fire byte. Du fyrer opp strace eller din favorittminneprofiler, og der er den - prosessen din ba bare om omtrent 72 KB fra operativsystemet. Ikke 4 byte. Ikke 64 byte. Hele 72 KB. Hvis du noen gang har stirret på det tallet og lurt på om verktøyet ditt løy for deg, er du ikke alene. Denne tilsynelatende bisarre oppførselen er et av de mest stilte spørsmålene blant C++-utviklere som graver inn i minnet for første gang, og svaret tar oss med på en fascinerende reise gjennom lagene som sitter mellom koden din og den faktiske maskinvaren.
Hva skjer når du ringer ny
For å forstå tallet på 72 KB, må du spore hele tildelingskjeden. Når C++-koden din kjører ny int, oversetter kompilatoren det til et kall til operatøren new, som på de fleste Linux-systemer delegerer til malloc fra glibc. Men malloc spør ikke kjernen direkte om 4 byte minne. Kjernen opererer i sider - typisk 4 KB på x86_64 - og kostnadene for et systemanrop er enorme i forhold til enkel minnetilgang. Å kalle brk() eller mmap() for hver individuelle tildeling ville få ethvert ikke-trivielt program til å stoppe opp.
I stedet fungerer glibcs minneallokator - en implementering kalt ptmalloc2, som i seg selv stammer fra Doug Leas klassiske dlmalloc - som en mellommann. Den ber om store minneblokker fra kjernen på forhånd, og deler dem deretter i mindre biter etter hvert som programmet ditt trenger dem. Dette er den grunnleggende grunnen til at din første 4-byte-allokering utløser en mye større forespørsel til operativsystemet. Tildeleren er ikke sløsing. Det er å være strategisk.
Dissekere 72 KB: Hvor bytene går
Den første allokeringsoverheaden kommer fra flere forskjellige komponenter som kjøretiden må initialiseres før den kan gi deg en enkelt byte med brukbart minne. Å forstå hver komponent forklarer hvorfor tallet lander der det kommer.
Først initialiserer glibcs malloc hovedarenaen - den primære bokføringsstrukturen som sporer alle allokeringer på hovedtråden. Denne arenaen inkluderer metadata for heapen, frilistepekere og bin-strukturer for forskjellige tildelingsstørrelser. Tildeleren utvider programpausen via sbrk(), og den innledende utvidelsen styres av en intern parameter kalt M_TOP_PAD, som er standard på 128 KB utfylling. Den faktiske første forespørselen justeres imidlertid for sidejustering og eksisterende pauseposisjon, noe som ofte resulterer i en mindre første forespørsel – vanligvis lander nær det 72 kB-tallet på en nystartet prosess.
💡 DID YOU KNOW?
Mewayz replaces 8+ business tools in one platform
CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.
Start Free →For det andre, siden glibc 2.26, initialiserer allokatoren en trådlokal cache (tcache) ved første gangs bruk. Tcachen inneholder 64 hyller (én per størrelsesklasse med liten tildeling), hver kan inneholde opptil 7 bufrede biter. Selve tcache_perthread_struct bruker rundt 1 KB, men handlingen med å initialisere den utløser det bredere arenaoppsettet. For det tredje har C++-kjøretiden allerede utført allokeringer før main() i det hele tatt kjører – statiske konstruktører, initialisering av iostream-buffer for std::cout og venner, og lokaloppsett bidrar alle til det første heap-fotavtrykket.
Arenasystemet og hvorfor forhåndstildeling er smart
Beslutningen om å forhåndstildele en betydelig del av minnet i stedet for å be om det stykkevis er ikke en tilfeldighet ved implementering. Det er en bevisst ingeniørmessig avveining forankret i flere tiår med erfaring med systemprogrammering. Hvert kall til brk() eller mmap() involverer en kontekstbytte fra brukerplass til kjerneplass, modifikasjon av prosessens virtuelle minnetilordninger og potensielle sidetabelloppdateringer. På moderne maskinvare koster et enkelt systemanrop omtrent 100–200 nanosekunder – trivielt isolert sett, katastrofalt i stor skala.
Tenk på et program som gjør 10 000 små tildelinger under initialisering. Uten forhåndstildeling vil det bety 10 000 systemanrop, som koster omtrent 1-2 millisekunder med ren overhead. Med en arenabasert tildeling trigg den første tildelingen
Build Your Business OS Today
From freelancers to agencies, Mewayz powers 138,000+ businesses with 208 integrated modules. Start free, upgrade when you grow.
Create Free Account →Related Posts
- Arkeologer finner mulige første direkte bevis på Hannibals krigselefanter
- Totalt sett er historien om tykktarmskreft oppmuntrende
- Dimensjoneringskaos
- Overdreven tokenbruk i Claude Code
Frequently Asked Questions
Hvorfor bruker min C++-prosess 72 KB når jeg bare allokerer 4 byte?
Den første minnetildelingen er alltid 72 KB på grunn av hvordan C++-standardbiblioteket og operativsystemet håndterer minneallokering. Det er en sikkerhets- og ytelsesoptimalisering. Standardbiblioteket reserverer et stort blokk på en gang for å unngå hyppige småallokeringer. Hvis du vil lære mer om minnehåndtering, kan du se våre 208 moduler på Mewayz for bare $49/måned.
Er dette en feil i minnetildelingsverktøyene?
Nei, dette er ikke en feil. Det er en normal del av C++-programmeringsmodellens oppførsel. Når du allokerer minne via new eller malloc, gjør standardbiblioteket en stor reservering for å forbedre ytelsen. Dette er dokumentert oppførsel som har vært til stede i mange år. For en dyptgående forklaring, kan du undersøke minnehåndteringsmodulene våre på Mewayz.
Hvordan kan jeg unngå denne store forhåndsallokeringen?
Du kan ikke direkte unngå den første 72 KB-tildelingen, da den er hardkodet i standardbiblioteket. Men du kan redusere antall allokeringer i resten av programmet ved å bruke tilgjengelige minnepooler eller statisk allokert minne der det er mulig. For avanserte teknikker, kan Mewayz sin kurs om minneoptimalisering være nyttig.
Gjelder denne oppførselen kun for C++ eller også for andre språk?
Denne spesifikke oppførsel er mest utbredt i C++ på grunn av språkets lave nivå minnehåndtering. Andre språk som Java eller C# har sine egne minneadministrasjonssystemer, men kan også ha store forhånds
Try Mewayz Free
All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.
Get more articles like this
Weekly business tips and product updates. Free forever.
You're subscribed!
Start managing your business smarter today
Join 30,000+ businesses. Free forever plan · No credit card required.
Ready to put this into practice?
Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.
Start Free Trial →Related articles
Hacker News
Hva avbrøt Go-konteksten min?
Mar 8, 2026
Hacker News
For å forstå vår fascinasjon for krystaller, ga forskere noen til sjimpanser
Mar 8, 2026
Hacker News
RFC 9849. TLS-kryptert klient Hei
Mar 8, 2026
Hacker News
Bedre JIT for Postgres
Mar 8, 2026
Hacker News
Agentiske ingeniørmønstre
Mar 8, 2026
Hacker News
En CPU som kjører utelukkende på GPU
Mar 8, 2026
Ready to take action?
Start your free Mewayz trial today
All-in-one business platform. No credit card required.
Start Free →14-day free trial · No credit card · Cancel anytime