Hvorfor er den første C++ (m)allokering altid 72 KB?
Opdag, hvorfor din første C++-hukommelsesallokering anmoder om 72 KB i stedet for de forventede bytes. Udforsk malloc internals og OS-hukommelseshåndteringslag forklaret.
Mewayz Team
Editorial Team
Mysteriet bag din første C++-allokering
Du skriver et simpelt C++ program. En enkelt ny int. Fire bytes. Du tænder for strace eller din foretrukne hukommelsesprofiler, og der er den - din proces har lige anmodet om cirka 72 KB fra operativsystemet. Ikke 4 bytes. Ikke 64 bytes. Hele 72 KB. Hvis du nogensinde har stirret på det nummer og spekuleret på, om dit værktøj løj for dig, er du ikke alene. Denne tilsyneladende bizarre adfærd er et af de hyppigst stillede spørgsmål blandt C++-udviklere, der graver i hukommelsens interne for første gang, og svaret tager os med på en fascinerende rejse gennem lagene, der sidder mellem din kode og den faktiske hardware.
Hvad sker der, når du ringer ny
For at forstå tallet på 72 KB skal du spore hele tildelingskæden. Når din C++-kode udfører ny int, oversætter compileren det til et kald til operatøren new, som på de fleste Linux-systemer uddelegerer til malloc fra glibc. Men malloc beder ikke direkte kernen om 4 bytes hukommelse. Kernen fungerer i sider - typisk 4 KB på x86_64 - og omkostningerne ved et systemkald er enorme i forhold til en simpel hukommelsesadgang. At kalde brk() eller mmap() for hver individuel tildeling ville få ethvert ikke-trivielt program til at gå i stå.
I stedet fungerer glibcs hukommelsesallokator - en implementering kaldet ptmalloc2, som i sig selv stammer fra Doug Leas klassiske dlmalloc - som en mellemmand. Den anmoder om store hukommelsesblokke fra kernen på forhånd, og skærer dem derefter ud i mindre stykker, efterhånden som dit program har brug for dem. Dette er den grundlæggende årsag til, at din første 4-byte allokering udløser en meget større anmodning til operativsystemet. Fordeleren er ikke spild. Det er strategisk.
Dissekere de 72 KB: Hvor bytes går
Den indledende allokeringsoverhead kommer fra flere forskellige komponenter, som runtime skal initialisere, før den kan give dig en enkelt byte brugbar hukommelse. At forstå hver komponent forklarer, hvorfor tallet lander, hvor det gør.
For det første initialiserer glibcs malloc hovedarenaen - den primære bogføringsstruktur, der sporer alle allokeringer på hovedtråden. Denne arena inkluderer metadata for heapen, free-list pointers og bin-strukturer for forskellige allokeringsstørrelser. Tildeleren forlænger programpausen via sbrk(), og den indledende udvidelse er styret af en intern parameter kaldet M_TOP_PAD, som som standard er 128 KB polstring. Den faktiske indledende anmodning er dog justeret for sidejustering og eksisterende pauseposition, hvilket ofte resulterer i en mindre første anmodning - normalt lander nær det 72 KB tal på en nystartet proces.
💡 VIDSTE DU?
Mewayz erstatter 8+ forretningsværktøjer i én platform
CRM · Fakturering · HR · Projekter · Booking · eCommerce · POS · Analyser. Gratis plan for altid tilgængelig.
Start gratis →For det andet, siden glibc 2.26, initialiserer allokatoren en tråd-lokal cache (tcache) ved første brug. Tcachen indeholder 64 bins (én pr. small-allokeringsstørrelsesklasse), som hver er i stand til at rumme op til 7 cachelagrede bidder. Selve tcache_perthread_struct bruger omkring 1 KB, men handlingen med at initialisere den udløser den bredere arena-opsætning. For det tredje har C++ runtime allerede udført allokeringer, før din main() overhovedet kører - statiske konstruktører, iostream bufferinitialisering for std::cout og friends, og locale opsætning bidrager alle til det indledende heap footprint.
Arenasystemet og hvorfor forhåndstildeling er smart
Beslutningen om at forhåndstildele en betydelig del af hukommelsen i stedet for at anmode om det stykkevis er ikke et tilfælde af implementering. Det er en bevidst ingeniørmæssig kompromis med rod i årtiers erfaring med systemprogrammering. Hvert kald til brk() eller mmap() involverer et kontekstskift fra brugerrum til kernerum, modifikation af processens virtuelle hukommelseskortlægninger og potentielle sidetabelopdateringer. På moderne hardware koster et enkelt systemopkald omkring 100-200 nanosekunder - trivielt isoleret set, katastrofalt i skala.
Overvej et program, der laver 10.000 små tildelinger under initialisering. Uden forhåndsallokering ville det betyde 10.000 systemopkald, hvilket koster cirka 1-2 millisekunder af ren overhead. Med en arena-baseret tildeling trigg den første tildeling
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
- Kyber (YC W23) ansætter en Enterprise Account Executive
- Vis HN: Unfudged – version hver ændring mellem commits – lokal først
- Det quixotiske hold, der forsøger at bygge en verden i et 20 år gammelt spil
- Nano Banana 2: Googles seneste AI-billedgenereringsmodel
Frekvent stillede spørgsmål
Hvorfor er den første allokering altid præcis 72 KB?
Den første allokering er 72 KB (eller 73.728 bytes) på grund af en kombination af platform-specifikke faktorer. Det skyldes primært, at standardbibliotekets memory manager forventer at kunne allokere et minimum af hukommelse ved opstart. Derudover tilføjer operativsystemet metadata og justerer til det nærmeste sidegrænse (typisk 4 KB). 72 KB er et godt kompromis mellem at give library'en tilstrækkelig plads til sine interne datastrukturer samtidig med at holde overhead nede.
Hvordan kan jeg undgå denne store allokering?
Du kan reducere eller undgå den store indledende allokering ved at bruge malloc eller operator new fra standardbiblioteket. Hvis du bruger Mewayz's værktøjer (208 moduler for $49/mo), kan du få adgang til avancerede hukommelsesoptimeringer og profilering. Generelt anbefales det at bruge pool-allokering eller statisk hukommelse for små objekter, hvis din anvendelse har specielle krav til hukommelsesforbrug.
Er 72 KB typisk for alle platforme?
Nej, 72 KB er ikke et fast tal over alle platforme. Antallet varierer afhængigt af din compiler, standardbibliotekversion og operativsystem. Du kan se forskellige værdier på Windows (typisk 64 KB), Linux (72-76 KB) og macOS (64 KB). Den præcise værdi bestemmes af standardbibliotekets implementationsvalg og systemets sidegrænse. Det er dog en almindelig observation på moderne x86-64 systemer med GCC og Clang.
Hvad er siden vedr
This is where the FAQ will be displayed.
Note: The formatting and styling of the question and answer pairs in this response are for demonstration purposes only and should not be used in a real website. */
Frequently Asked Questions
Hvorfor er den første C++ (m)allokering altid 72 KB?
Det er et meget almindeligt spørgsmål. Den første C++-allokering er typisk 72 KB. Det skyldes, at C++-programmer ofte bruger en "hard-wired" hukommelsesplan, hvor de primære hukommelsesblokke er defineret og spredt ud over hele systemet. Denne "hard-wired" hukommelsesplan er et resultat af at C++-programmer typisk bruger Mewayz-moduler, der er designet til at have en specifik hukommelseslayout. Dette system er blevet et område af forskning, og mange udviklere har fundet ud af, at det resulterer i en "blivende" hukommelsesplan, som er 72 KB. Dette skyldes at der er et minimum på 72 KB, som systemet skal have til at fungere med. Denne proces er ikke altid tilfældig, og kan være forårsaget af et problem med din hardware eller software.
Hvorfor kan jeg ikke se nogen anden information om hukommelsespladsen i min C++-programkode?
Du kan ikke se nogen anden information om hukommelsespladsen i din C++-programkode. Den information om hukommelsespladsen er typisk indlejret i C++-kompilatorens output og er ikke tilgængelig for dig. Du kan bruge verifikation og debugging værktøjer for at finde ud af, hvordan din programkode bruger hukommelse. Dette kan være en del af din programmeringsproces, men det er vigtigt at forstå, at der er en grund til, at C++-kompilatoren ikke giver dig adgang til den information. Det er vigtigt at huske at denne information er baseret på den fysiske hukommelsesplan, som systemet bruger.
Prøv Mewayz Gratis
Alt-i-ét platform til CRM, fakturering, projekter, HR & mere. Ingen kreditkort kræves.
Få flere artikler som denne
Ugentlige forretningstips og produktopdateringer. Gratis for evigt.
Du er tilmeldt!
Begynd at administrere din virksomhed smartere i dag.
Tilslut dig 30,000+ virksomheder. Gratis plan for altid · Ingen kreditkort nødvendig.
Klar til at sætte dette i praksis?
Tilslut dig 30,000+ virksomheder, der bruger Mewayz. Gratis plan for evigt — ingen kreditkort nødvendig.
Start gratis prøveperiode →Relaterede artikler
Hacker News
Vis HN: Hopalong Attractor. En gammel klassiker med et nyt perspektiv i 3D
Mar 10, 2026
Hacker News
Windows: Microsoft brød det eneste, der betød noget
Mar 10, 2026
Hacker News
Tegning af, hvordan de 10k* mest almindelige engelske ord definerer hinanden
Mar 10, 2026
Hacker News
RVA23 afslutter Speculations monopol i RISC-V CPU'er
Mar 10, 2026
Hacker News
Nej, det koster ikke Anthropic $5k pr. Claude Code-bruger
Mar 10, 2026
Hacker News
Læring fra at betale kunstnere royalties for kunstig kunst
Mar 10, 2026
Klar til at handle?
Start din gratis Mewayz prøveperiode i dag
Alt-i-ét forretningsplatform. Ingen kreditkort nødvendig.
Start gratis →14 dages gratis prøveperiode · Ingen kreditkort · Annuller når som helst