Hacker News

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.

7 min læst

Mewayz Team

Editorial Team

Hacker News

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 →
(use Danish: Frekvent stillede spørgsmål)

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.

Begynd at administrere din virksomhed smartere i dag.

Tilslut dig 30,000+ virksomheder. Gratis plan for altid · Ingen kreditkort nødvendig.

Fandt du dette nyttigt? Del det.

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 →

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