Perchè a prima allocazione C++ (m) hè sempre 72 KB?
Cumenti
Mewayz Team
Editorial Team
U misteru daretu à a vostra prima allocazione C++
Scrivi un prugramma C++ simplice. Un unicu novu int. Quattru bytes. Pigliate straceo u vostru prufilu di memoria preferitu, è eccu - u vostru prucessu hà dumandatu circa 72 KB da u sistema operatore. Micca 4 bytes. Micca 64 bytes. A piena 72 KB. Sè vo avete mai fighjatu à quellu numeru è dumandassi s'ellu u vostru arnesi vi menti, ùn site micca solu. Stu cumpurtamentu apparentemente stranu hè una di e dumande più frequenti trà i sviluppatori C++ chì scavanu in l'internu di a memoria per a prima volta, è a risposta ci porta in un viaghju affascinante attraversu i strati chì si trovanu trà u vostru codice è u hardware propiu.
Ciò chì succede quandu chjamate novu
Per capisce a figura di 72 KB, avete bisognu di traccia a catena di allocazione completa. Quandu u vostru codice C++ eseguisce new int, u compilatore traduce in una chjama à operatore new, chì in a maiò parte di i sistemi Linux delegate à mallocda glibc. Ma mallocùn dumanda micca direttamente à u kernel per 4 bytes di memoria. U kernel opera in pagine - tipicamente 4 KB in x86_64 - è u costu di una chjama di u sistema hè enormu relative à un accessu simplice di memoria. Chjamate brk() o mmap() per ogni allocazione individuale ferà un arrestu di qualsiasi prugramma micca triviale.
Invece, l'allocatore di memoria di glibc - una implementazione chjamata ptmalloc2, ellu stessu discendente da u classicu dlmalloc di Doug Lea - agisce cum'è un intermediariu. Richiede grandi blocchi di memoria da u kernel in anticipu, poi li taglia in pezzi più chjuchi cum'è u vostru prugramma ne hà bisognu. Questu hè u mutivu fundamentale chì a vostra prima allocazione di 4 byte provoca una dumanda assai più grande à u sistema operatore. L'allocatore ùn hè micca persu. Hè esse strategicu.
Dissezzione di i 72 KB: Induve i Bytes Go
L'allocazione iniziale vene da parechji cumpunenti distinti chì u runtime deve inizializà prima di pudè trasmette ancu un unicu byte di memoria utilizable. Capisce ogni cumpunente spiega perchè u numeru sbarca induve si faci.
Prima, u malloc di glibc inizializza l'arena principale - a struttura di cuntabilità primaria chì traccia tutte l'assegnazioni nantu à u filu principale. Questa arena include metadati per u munzeddu, puntatori di lista libera, è strutture bin per diverse dimensioni di allocazione. L'allocatore estende u prugramma via sbrk(), è l'estensione iniziale hè guvernata da un paràmetru internu chjamatu M_TOP_PAD, chì predeterminatu à 128 KB di padding. In ogni casu, a dumanda iniziale attuale hè adattata per l'allineamentu di a pagina è a pusizione di pausa esistente, chì spessu si traduce in una prima dumanda più chjuca - cumunamenti sbarca vicinu à quella figura di 72 KB in un prucessu appena iniziatu.
Secunna, da a glibc 2.26, l'allocatore inizializza una cache locale di thread (tcache) à u primu usu. U tcache cuntene 64 bins (unu per classa di dimensione di piccula allocazione), ognunu capaci di mantene finu à 7 pezzi in cache. U tcache_perthread_structu stessu cunsumu circa 1 KB, ma l'attu di l'inizializazione attiva a configurazione di arena più larga. Terzu, u C++ runtime hà digià realizatu allocazioni prima di u vostru main() ancu eseguite - custruttori statici, inizializazione di buffer iostream per std::cout è l'amici, è a cunfigurazione locale cuntribuiscenu tutti à quella impronta iniziale di heap.
U Sistema Arena è Perchè a Pre-Allocation hè Intelligente
A decisione di pre-assignà una parte sustanziale di memoria piuttostu chè di dumandà a pezziunata ùn hè micca un accidente di implementazione. Hè un tradeoff ingegneria deliberatu arradicatu in decennii di sperienza di prugrammazione di sistemi. Ogni chjama à brk() o mmap() implica un cambiamentu di cuntestu da u spaziu di l'utilizatori à u spaziu di u kernel, a mudificazione di i mappings di memoria virtuale di u prucessu, è l'aghjurnamenti potenziali di a tabella di pagina. Nantu à u hardware mudernu, una sola chjama di u sistema costa circa 100-200 nanosecondi - triviale in isolamentu, catastròficu à scala.
Considerate un prugramma chì face 10 000 picculi allocazioni durante l'inizializazione. Senza pre-allocazione, chì significheghja 10,000 chjama di u sistema, chì custanu circa 1-2 millisecondi di overhead pura. Cù un allocatore basatu in arena, a prima allocazione attiva una sola chjama di u sistema, è e 9,999 allocazioni successive sò servite interamente in u spaziu di l'utilizatori attraversu l'aritmetica di puntatori è l'operazioni di lista ligata - ognuna pigghia circa 10-50 nanosecondi. A matematica hè senza ambiguità: a pre-allocazione vince per ordini di grandezza.
U 72 KB chì vede nantu à a vostra prima allocazione ùn hè micca una memoria persa - hè un investimentu di rendiment. L'allocatore scommette chì u vostru prugramma farà più allocazioni prestu, è in quasi tutti i scenarii di u mondu reale, quella scumessa paga assai. U costu di u spaziu di indirizzu virtuale inutilizatu hè essenzialmente zero nantu à i sistemi moderni di 64 bit.
Memoria virtuale versus memoria fisica: perchè ùn importa micca
Una preoccupazione cumuna trà i sviluppatori chì scontranu stu cumpurtamentu per a prima volta hè u rifiutu di risorse. Sì solu bisognu di 4 bytes, perchè u mo prugramma cunsuma 72 KB? L'insight critica hè chìa memoria virtuale ùn hè micca memoria fisica. Quandu glibc estende l'interruzione di u prugramma da 72 KB, u kernel aghjurnà i mappings di memoria virtuale di u prucessu, ma ùn torna micca immediatamente quelli pagine cù RAM fisica. E pagine fisiche attuali sò attribuite nantu à a dumanda attraversu faults di pagina - solu quandu u vostru prugramma scrive à un indirizzu specificu, u kernel assigna una vera pagina di memoria à ellu.
💡 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 →Questu significa chì ancu s'è a dimensione virtuale di u vostru prucessu aumenta di 72 KB, a so taglia di set residente (RSS) - a quantità di RAM fisica effettivamente cunsumata - aumenta solu da e pagine chì veramente toccu. Per una sola new int, chì hè tipicamente una pagina di 4 KB, più qualsiasi pagine chì i metadati di l'arena occupanu. U spaziu virtuale restante si trova quì, prontu per l'usu, chì ùn custa nunda ma spaziu di indirizzu - di quale avete 128 TB in un sistema Linux 64-bit.
Sta distinzione hè critica quandu u prufilu è u monitoraghju di l'applicazioni di produzzione. Sè vo site custruendu un software chì hà bisognu di seguità u cunsumu di risorse reale - sia un backend SaaS, un microserviziu, o un pipeline analiticu cum'è quelli chì funzionanu nantu à e plataforme cum'è Mewayzper l'operazioni cummerciale - duvete sempre monitorizà RSS invece di dimensione virtuale. Strumenti cum'è /proc/[pid]/smaps, valgrind --tool=massif, è pmap ponu dà impronte precise di memoria fisica piuttostu cà ingannà figure di memoria virtuale.
Cumu Diversi Allocatori Maneggianu a Prima Allocazione
A figura di 72 KB hè specifica per u ptmalloc2 di glibc. L'altri allocatori facenu cummerci diversi, è l'allocazione iniziale varia in cunseguenza. Capisce queste diffirenzii hè preziosa quandu sceglite un allocatore per applicazioni sensibili à u rendiment.
- jemalloc (usatu da Facebook, FreeBSD) - Aduprà una struttura di arena più granulare cù cache lucali di thread. L'overhead iniziale tende à esse più altu (spessu 200+ KB) ma offre un rendimentu multi-threaded megliu per via di una cuntenuta di serratura ridutta.
- tcmalloc (Thread-Caching Malloc di Google) - Alloca una cache per thread di circa 2 MB per difettu, cù pre-allocazione aggressiva. L'overhead iniziale hè più altu, ma i picculi allocazioni successivi sò estremamente veloci.
- musl libc's malloc - Aduprà un disignu assai più simplice basatu nantu à mmap per tutte l'assegnazione. L'overhead iniziale hè minimu (spessu solu 4 KB per allocazione), ma u costu per allocazione hè più altu per via di e chjama di u sistema più frequenti.
- mimalloc (Microsoft) - Utiliza l'allocazione basata in segmenti cù segmenti di 64 MB. A prima allocazione attiva una riservazione virtuale di 64 MB (cù impegnu fisicu minimu), spaziu d'indirizzu cummerciale per una località eccezziunale è un throughput.
A scelta trà questi allocatori dipende interamente da a vostra carica di travagliu. Per l'applicazioni di u servitore di longa durata cù una pesante allocazione multi-threaded, jemalloc o tcmalloc tipicamente supera u predefinitu di glibc. Per i sistemi incrustati di memoria limitata, l'approcciu più simplice di musl pò esse preferibile malgradu un rendimentu più bassu. Per a maiò parte di l'applicazioni di u desktop è di u servitore di u scopu generale, u overhead iniziale di ptmalloc2 di 72 KB rapprisenta un predefinitu raghjone chì funziona bè senza sintonizazione.
Tuning the Initial Allocation Behavior
Se l'overhead iniziale di 72 KB predeterminatu hè veramente problematicu per u vostru casu d'usu - forse site generatu millaie di prucessi di corta durata, ognuna facendu solu una manciata di allocazioni - glibc furnisce parechji tunables via mallopt() è a famiglia MALLOC_ di variabili ambientali.
U paràmetru M_TOP_PAD cuntrola quanta memoria extra richiede l'allocatore oltre ciò chì hè immediatamente necessariu. A mette à 0 cù mallopt(M_TOP_PAD, 0) dice à l'allocatore di dumandà solu ciò chì hè necessariu, riducendu significativamente l'overhead iniziale. U paràmetru M_MMAP_THRESHOLD cuntrolla a dimensione sopra à quale l'allocazioni utilizanu mmap invece di l'arena. U M_TRIM_THRESHOLD cuntrolla quandu a memoria liberata hè tornata à u SO. È da a glibc 2.26, i tunables glibc.malloc.tcache_count è glibc.malloc.tcache_max permettenu di cuntrullà u cumpurtamentu di a cache di filu.
Tuttavia, una parolla di prudenza: a sintonizazione di sti paràmetri senza benchmarking attentu guasi sempre peghju e cose. I predeterminati sò stati scelti basatu annantu à una larga prufilu di u mondu reale, è rapprisentanu un locu dolce per a maiò parte di i carichi di travagliu. A menu chì ùn avete una forte evidenza da u prufilu di pruduzzione chì malloc overhead hè un collu di buttiglia - è avete misuratu l'impattu di i vostri cambiamenti - lasciate solu i predefiniti. L'ottimisazione prematura di l'allocatore hè una forma particularmente insidiosa di rasatura di yak chì hà cunsumatu innumerevoli ore di ingegneria per un benefiziu insignificante.
Ciò chì questu ci insegna nantu à a prugrammazione di sistemi
U misteru di a prima allocazione di 72 KB hè, in u so core, una lezzione nantu à strati di astrazione. C ++ vi dà l'illusione chì new intalloca 4 bytes. U standard di lingua dice cusì. U vostru mudellu mentale dice cusì. Ma trà u vostru codice è u hardware si trova una pila di sistemi sofisticati - u runtime C ++, l'allocatore di biblioteca C, u sottosistema di memoria virtuale di u kernel, è l'MMU è TLB di u hardware - ognuna aghjunghjendu i so propri comportamenti, ottimisazioni è overhead.
Questu ùn hè micca un difettu. Hè u puntu tutale di u software di sistemi. Ogni strata esiste per risolve un veru prublema: l'allocatore esiste per ùn avè micca bisognu di fà chjamate sistema per ogni allocazione. U sistema di memoria virtuale esiste cusì ùn avete micca bisognu di gestisce direttamente a memoria fisica. U gestore di errore di pagina esiste cusì a memoria hè impegnata in modu pigro è efficiente. Ogni strata cummercia una piccula quantità di trasparenza per una grande quantità di rendiment è cunvenzione.
I sviluppatori chì custruiscenu i sistemi più affidabili è più performanti sò quelli chì capiscenu sti strati - micca perchè anu bisognu di pensà à elli constantemente, ma perchè quandu succede qualcosa inesperu (cum'è una misteriosa allocazione di 72 KB), anu u mudellu mentale per capisce perchè. Sia chì site custruendu un sistema di cummerciale in tempu reale, un mutore di ghjocu, o una piattaforma cummerciale chì serve migliaia d'utilizatori, a capacità di ragiunà nantu à ciò chì u vostru codice in realtà face à u livellu di u sistema hè ciò chì separa i sviluppatori competenti da quelli eccezziunali. U 72 KB ùn hè micca un bug. Hè u vostru allocatore chì face u so travagliu brillanti.
Custruisce u vostru sistema operativu cummerciale oghje
Da i freelancers à l'agenzii, Mewayz alimenta più di 138.000 imprese cù 207 moduli integrati. Cumincià gratis, aghjurnà quandu cresce.
Crea un contu gratuitu →
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
Bluesky has been dealing with a DDoS attack for nearly a full day
Apr 17, 2026
Hacker News
Human Accelerated Region 1
Apr 17, 2026
Hacker News
Discourse Is Not Going Closed Source
Apr 17, 2026
Hacker News
Substrate AI Is Hiring Harness Engineers
Apr 17, 2026
Hacker News
US Bill Mandates On-Device Age Verification
Apr 17, 2026
Hacker News
Show HN: SPICE simulation → oscilloscope → verification with Claude Code
Apr 17, 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