Hacker News

Pse ndarja e parë C++ (m) është gjithmonë 72 KB?

Zbuloni pse ndarja juaj e parë e memories C++ kërkon 72 KB në vend të bajteve të pritura. Eksploroni të brendshmet malloc dhe shtresat e menaxhimit të kujtesës OS të shpjeguara.

6 min lexim

Mewayz Team

Editorial Team

Hacker News

Misteri pas ndarjes suaj të parë në C++

Ju shkruani një program të thjeshtë C++. Një int i ri i vetëm. Katër bajt. Ju aktivizoni strace ose profiluesin tuaj të preferuar të kujtesës, dhe ja ku është - procesi juaj sapo kërkoi afërsisht 72 KB nga sistemi operativ. Jo 4 bajt. Jo 64 bajt. Plot 72 KB. Nëse e keni parë ndonjëherë atë numër dhe keni pyetur veten nëse vegla juaj po ju gënjen, nuk jeni vetëm. Kjo sjellje në dukje e çuditshme është një nga pyetjet më të shpeshta në mesin e zhvilluesve të C++ që gërmojnë në brendësi të memories për herë të parë dhe përgjigja na çon në një udhëtim magjepsës nëpër shtresat që ndodhen midis kodit tuaj dhe harduerit aktual.

Çfarë ndodh kur telefononi të re

Për të kuptuar shifrën 72 KB, duhet të gjurmoni zinxhirin e plotë të alokimit. Kur kodi juaj C++ ekzekuton int të ri, përpiluesi e përkthen atë në një thirrje për operatorin e ri, i cili në shumicën e sistemeve Linux delegon te malloc nga glibc. Por malloc nuk i kërkon drejtpërdrejt kernelit 4 bajt memorie. Kerneli funksionon në faqe - zakonisht 4 KB në x86_64 - dhe kostoja e një thirrjeje sistemi është e madhe në krahasim me një akses të thjeshtë memorie. Thirrja e brk() ose mmap() për çdo alokim individual do të bënte që çdo program jo i parëndësishëm të ndalonte.

Në vend të kësaj, alokuesi i memories së glibc - një zbatim i quajtur ptmalloc2, vetë i ardhur nga dlmalloc klasik i Doug Lea - vepron si ndërmjetës. Kërkon blloqe të mëdha memorie nga kerneli përpara, dhe më pas i gdhend ato në copa më të vogla sipas nevojës së programit tuaj. Kjo është arsyeja kryesore pse shpërndarja juaj e parë prej 4 bajtësh shkakton një kërkesë shumë më të madhe për sistemin operativ. Alokuesi nuk është shpërdorues. Është strategjike.

Zbërthimi i 72 KB: Ku shkojnë bajtët

💡 A E DINI?

Mewayz zëvendëson 8+ mjete biznesi në një platformë

CRM · Faturimi · HR · Projekte · Rezervime · eCommerce · POS · Analitikë. Plan falas përgjithmonë.

Filloni falas →

Shpërndarja fillestare e përgjithshme vjen nga disa komponentë të veçantë që koha e ekzekutimit duhet të inicializojë përpara se të mund t'ju japë qoftë edhe një bajt të vetëm memorie të përdorshme. Kuptimi i secilit komponent shpjegon pse numri zbret aty ku ndodh.

Së pari, malloc i glibc inicializon arenën kryesore - strukturën kryesore të kontabilitetit që gjurmon të gjitha alokimet në fillin kryesor. Kjo arenë përfshin meta të dhëna për grumbullin, treguesit e listës së lirë dhe strukturat e koshit për madhësi të ndryshme shpërndarjeje. Përcaktuesi zgjeron ndërprerjen e programit nëpërmjet sbrk(), dhe shtrirja fillestare drejtohet nga një parametër i brendshëm i quajtur M_TOP_PAD, i cili parazgjedhur është 128 KB mbushje. Megjithatë, kërkesa fillestare aktuale rregullohet për shtrirjen e faqeve dhe pozicionin ekzistues të ndërprerjes, gjë që shpesh rezulton në një kërkesë të parë më të vogël - zakonisht zbarkohet afër asaj figure prej 72 KB në një proces të sapofilluar.

Së dyti, që nga glibc 2.26, alokuesi inicializon një thread-local cache (tcache) në përdorimin e parë. Tcache përmban 64 kosha (një për klasë të madhësisë së alokimit të vogël), secili i aftë të mbajë deri në 7 copa të ruajtura në memorie. Vetë tcache_perthread_struct konsumon rreth 1 KB, por akti i inicializimit të tij shkakton konfigurimin më të gjerë të arenës. Së treti, koha e ekzekutimit në C++ ka kryer tashmë alokime përpara se të ekzekutohet main() juaj - konstruktorët statikë, inicializimi i bufferit iostream për std::cout dhe miqtë, dhe konfigurimi i vendndodhjes, të gjitha kontribuojnë në atë gjurmë fillestare të grumbullit.

Sistemi i Arenës dhe Pse Para-Alokimi është i zgjuar

Vendimi për të paracaktuar një pjesë të konsiderueshme të memories në vend që të kërkohet pjesë-pjesë nuk është një rastësi zbatimi. Është një shkëmbim i qëllimshëm inxhinierik i rrënjosur në dekada të përvojës së programimit të sistemeve. Çdo thirrje në brk() ose mmap() përfshin një ndërrim të kontekstit nga hapësira e përdoruesit në hapësirën e kernelit, modifikimin e hartave të kujtesës virtuale të procesit dhe përditësimet e mundshme të tabelës së faqeve. Në pajisjet moderne, një telefonatë e vetme sistemore kushton afërsisht 100-200 nanosekonda – e parëndësishme në izolim, katastrofike në shkallë.

Konsideroni një program që bën 10,000 alokime të vogla gjatë inicializimit. Pa paracaktim, kjo do të thoshte 10,000 telefonata sistemore, që kushtojnë afërsisht 1-2 milisekonda shpenzim të përgjithshëm. Me një alokues të bazuar në arenë, aktivizohet alokimi i parë

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 →
and ending with

Frequently Asked Questions
    ### Why is my first C++ program always 72 KB? The 72 KB size is not your actual program code. This includes the executable header, memory for the stack, heap, and various runtime libraries that the C++ compiler links by default. Even a minimal "Hello World" program requires this overhead for the operating system to properly load and execute it as a valid process. ### What exactly makes up these 72 KB? The 72 KB consists of several components: the executable file header (PE format on Windows, ELF on Linux), startup code (crt0), standard library initialization, stack space allocation (typically several KB), and memory page alignment requirements. The actual compiled machine code is just a tiny fraction of this total size. ### Can I reduce the executable size below 72 KB? Yes, with compiler optimizations and linker settings. Using flags like `-s` to strip debug symbols, `-ffunction-sections` and `-Wl,--gc-sections` to remove unused code, and static linking can significantly reduce size. However, you cannot eliminate all overhead as some runtime components are essential for process creation. ### How does this differ from other programming languages? C and C++ have higher overhead due to manual memory management and complex runtime requirements. Languages like Go or Rust have similar overhead, while interpreted languages (Python, JavaScript) don't show this overhead in the executable file itself. The 72 KB is specific to how compiled native code must be structured for the operating system loader.

Provoni Mewayz Falas

Platformë e gjithë-në-një për CRM, faturim, projekte, HR & më shumë. Nuk kërkohet kartelë krediti.

Filloni të menaxhoni biznesin tuaj më me zgjuarsi sot.

Bashkohuni me 30,000+ biznese. Plan falas përgjithmonë · Nuk kërkohet kartelë krediti.

E gjetët të dobishme? Shpërndajeni.

Gati për ta vënë në praktikë?

**Join 30,000+ business using Mewayz. Free forever plan — no credit card required.**

Fillo Versionin Falas →

Artikuj të Ngjashëm

Hacker News

Trafiku nga Rusia në Cloudflare është 60% më pak nga viti i kaluar

Mar 10, 2026

Hacker News

Sa opsione përshtaten në një boolean?

Mar 10, 2026

Hacker News

Caxlsx: Perlë rubin për gjenerimin xlsx me grafikët, imazhet, vërtetimin e skemës

Mar 10, 2026

Hacker News

Shfaq HN: DD Photos – gjenerator i faqes së albumit fotografik me burim të hapur (Go dhe SvelteKit)

Mar 10, 2026

Hacker News

Një version i ri i mjedisit tonë Oracle Solaris për zhvilluesit

Mar 10, 2026

Hacker News

Trego HN: Si arrita në krye të tabelës drejtuese të HuggingFace Open LLM në dy GPU të lojërave

Mar 10, 2026

Gati për të ndërmarrë veprim?

Filloni provën tuaj falas të Mewayz sot

Platformë biznesi all-in-one. Nuk kërkohet kartë krediti.

Filloni falas →

14-ditore provë falas · Pa kartelë krediti · Anuloni kur të doni