Kial la unua C++ (m)asigno ĉiam estas 72 KB?
Komentoj
Mewayz Team
Editorial Team
La Mistero Malantaŭ Via Unua C++-Asigno
Vi verkas simplan programon C++. Ununura nova int. Kvar bajtoj. Vi ekbruligas strace aŭ vian preferatan memorprofililon, kaj jen — via procezo ĵus petis proksimume 72 KB de la operaciumo. Ne 4 bajtoj. Ne 64 bajtoj. Plena 72 KB. Se vi iam fiksrigardis tiun numeron kaj scivolis ĉu via ilaro mensogas al vi, vi ne estas sola. Ĉi tiu ŝajne bizara konduto estas unu el la plej oftaj demandoj inter C++-programistoj, kiuj unuafoje fosas en memorinternaĵojn, kaj la respondo kondukas nin al fascina vojaĝo tra la tavoloj, kiuj sidas inter via kodo kaj la reala aparataro.
Kio Okazas Kiam Vi Vokas nova
Por kompreni la 72 KB-ciferon, vi devas spuri la plenan asignan ĉenon. Kiam via C++-kodo ekzekutas nova int, la kompililo tradukas tion en alvokon al operatoro new, kiu ĉe la plej multaj Linuksaj sistemoj delegas al malloc de glibc. Sed malloc ne rekte petas de la kerno 4 bajtojn da memoro. La kerno funkcias en paĝoj - tipe 4 KB sur x86_64 - kaj la kosto de sistemvoko estas enorma relative al simpla memoraliro. Voki brk() aŭ mmap() por ĉiu individua asigno haltigus ajnan ne-trivialan programon.
Anstataŭe, la memor-asignilo de glibc — efektivigo nomata ptmalloc2, mem devena de la klasika dlmalloc de Doug Lea — agas kiel peranto. Ĝi petas grandajn blokojn da memoro de la kerno antaŭe, tiam tranĉas ilin en pli malgrandajn pecojn kiam via programo bezonas ilin. Ĉi tio estas la fundamenta kialo, ke via unua 4-bajta asigno ekigas multe pli grandan peton al la operaciumo. La asignanto ne estas malŝparema. Ĝi estas strategia.
Disekci la 72 KB: Kien la Bajtoj Iras
La komenca asigno-superkosto venas de pluraj apartaj komponantoj, kiujn la rultempo devas pravalorigi antaŭ ol ĝi povas transdoni al vi eĉ unu bajton da uzebla memoro. Kompreni ĉiun komponanton klarigas kial la nombro alteriĝas kie ĝi okazas.
Unue, la malloc de glibc pravalorigas la ĉefan arenon — la ĉefan librotenan strukturon, kiu spuras ĉiujn asignojn sur la ĉefa fadeno. Ĉi tiu areno inkluzivas metadatenojn por la amaso, liber-listmontrilojn, kaj binstrukturojn por malsamaj asignograndoj. La alsignilo etendas la programpaŭzon per sbrk(), kaj la komenca etendaĵo estas regata de interna parametro nomata M_TOP_PAD, kiu defaŭlte je 128 KB de kompletigo. Tamen, la reala komenca peto estas ĝustigita por paĝa vicigo kaj ekzistanta rompopozicio, kiu ofte rezultigas pli malgrandan unuan peton — ofte alteriĝanta proksime de tiu 72 KB-cifero sur ĵus komencita procezo.
Due, ekde glibc 2.26, la asignilo pravigigas faden-lokan kaŝmemoron (tcache) ĉe la unua uzo. La tcache enhavas 64 rubujojn (unu per malgrand-asigna klaso), ĉiu kapabla teni ĝis 7 kaŝmemoritajn pecojn. La tcache_perthread_struct mem konsumas ĉirkaŭ 1 KB, sed la ago de pravalorigo de ĝi ekigas la pli larĝan arenon. Trie, la rultempo de C++ jam faris asignojn antaŭ ol via main() eĉ funkciigas — senmovaj konstrukciistoj, iostream-bufrinicialigo por std::cout kaj amikoj, kaj loka agordo ĉiuj kontribuas al tiu komenca amaspremo.
La Areno-Sistemo kaj Kial Antaŭ-Asigno Estas Saĝa
La decido antaŭ-asigni grandan parton da memoro anstataŭ peti ĝin popoce ne estas akcidento de efektivigo. Ĝi estas intencita inĝenieristiko enradikiĝinta en jardekoj da sistemaj programaj spertoj. Ĉiu voko al brk() aŭ mmap() implikas kuntekstan ŝanĝon de uzantspaco al kernspaco, modifo de la virtuala memormapado de la procezo, kaj eblaj paĝtabelaj ĝisdatigoj. Sur moderna aparataro, ununura sistemvoko kostas proksimume 100-200 nanosekundoj — bagatela izole, katastrofa laŭskale.
Konsideru programon, kiu faras 10 000 malgrandajn asignojn dum inicialigo. Sen antaŭ-asignado, tio signifus 10,000 sistemvokojn, kostante proksimume 1-2 milisekundojn da pura superkosto. Kun aren-bazita asignilo, la unua asigno ekigas ununuran sisteman vokon, kaj la postaj 9,999 asignoj estas servataj tute en uzantspaco per montraj aritmetikaj kaj ligitaj-listaj operacioj - ĉiu daŭrante ĉirkaŭ 10-50 nanosekundojn. La matematiko estas malambigua: antaŭ-asigno gajnas laŭ grandordoj.
La 72 KB, kiujn vi vidas en via unua asigno, ne estas malŝparita memoro — ĝi estas rendimenta investo. La asignanto vetas, ke via programo baldaŭ faros pli da asignoj, kaj en preskaŭ ĉiu reala scenaro, tiu veto bonege pagas. La kosto de neuzata virtuala adresspaco estas esence nula en modernaj 64-bitaj sistemoj.
Virtuala Memoro kontraŭ Fizika Memoro: Kial Ĝi Ne Gravas
Komuna zorgo inter programistoj, kiuj renkontas ĉi tiun konduton unuafoje, estas malŝparo de rimedoj. Se mi bezonas nur 4 bajtojn, kial mia programo konsumas 72 KB? La kritika kompreno estas, ke virtuala memoro ne estas fizika memoro. Kiam glibc etendas la programpaŭzon je 72 KB, la kerno ĝisdatigas la virtualajn memormapadojn de la procezo, sed ĝi ne tuj malantaŭeniras tiujn paĝojn per fizika RAM. La realaj fizikaj paĝoj estas asignitaj laŭpeto pro paĝaj misfunkciadoj — nur kiam via programo skribas al specifa adreso, la kerno asignas al ĝi veran paĝon de memoro.
💡 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 →Ĉi tio signifas, ke kvankam la virtuala grandeco de via procezo pliiĝas je 72 KB, ĝia loĝanta aro grandeco (RSS) — la kvanto de fizika RAM efektive konsumita — pliiĝas nur per la paĝoj, kiujn vi efektive tuŝas. Por unuopa nova int, tio estas tipe unu 4 KB-paĝo, plus kiajn ajn paĝojn okupas la arenmetadatumoj. La restanta virtuala spaco sidas tie, preta por uzo, kostante nenion krom adrespaco — el kiu vi havas 128 TB sur 64-bita Linukso-sistemo.
Tiu distingo estas kritika dum profilado kaj monitorado de produktadaplikoj. Se vi konstruas programaron, kiu bezonas spuri realan konsumon de rimedoj - ĉu ĝi estas SaaS-backend, mikroservo aŭ analiza dukto kiel tiuj, kiuj funkcias sur platformoj kiel ekzemple Mewayzpor komercaj operacioj - vi ĉiam devas monitori RSS prefere ol virtuala grandeco. Iloj kiel /proc/[pid]/smaps, valgrind --tool=massif, kaj pmap povas doni al vi precizajn fizikajn memorpiedsignojn prefere ol misgvidaj virtualaj memorciferoj.
Kiel Malsamaj Asignantoj Pritraktas la Unuan Asignadon
La 72 KB-cifero estas specifa por la ptmalloc2 de glibc. Aliaj atribuantoj faras malsamajn kompromisojn, kaj la komenca asigno-superkosto varias laŭe. Kompreni ĉi tiujn diferencojn estas valora dum elektado de alsignilo por agado-sentemaj aplikoj.
- jemalloc (uzita de Facebook, FreeBSD) — Uzas pli grajnecan arenostrukturon kun faden-lokaj kaŝmemoroj. La komenca superkosto tendencas esti pli alta (ofte 200+ KB) sed liveras pli bonan multfadenan rendimenton pro reduktita serurodisputo.
- tcmalloc (Google's Thread-Caching Malloc) — Atribuas po-fadenan kaŝmemoron de proksimume 2 MB defaŭlte, kun agresema antaŭ-atribuo. Komenca superkosto estas pli alta, sed postaj malgrandaj asignoj estas ege rapidaj.
- malloc de musl libc — Uzas multe pli simplan dezajnon bazitan sur mmap por ĉiuj atribuoj. Komenca superkosto estas minimuma (ofte nur 4 KB per asigno), sed po-asigna kosto estas pli alta pro pli oftaj sistemvokoj.
- mimalloc (Mikrosofto) — Uzas segment-bazitan atribuon kun 64 MB-segmentoj. La unua asigno ekigas virtualan rezervadon de 64 MB (kun minimuma fizika engaĝiĝo), komercanta adresspacon por esceptaj loko kaj trairo.
La elekto inter ĉi tiuj atribuantoj dependas tute de via laborkvanto. Por longdaŭraj servilaj aplikoj kun peza multfadena asigno, jemalloc aŭ tcmalloc tipe superas la defaŭlton de glibc. Por memor-limigitaj enkonstruitaj sistemoj, la pli simpla aliro de musl povas esti preferinda malgraŭ pli malalta trairo. Por la plej multaj ĝeneraluzeblaj labortablaj kaj servilaj aplikoj, la komenca superkosto de 72 KB de ptmalloc2 reprezentas akcepteblan defaŭlton kiu funkcias bone sen agordo.
Agordo de la Komenca Asigna Konduto
Se la defaŭlta 72 KB komenca superkosto estas vere problema por via uzokazo — eble vi generas milojn da mallongdaŭraj procezoj, ĉiu farante nur manplenon da asignoj — glibc disponigas plurajn agordeblajn per mallopt() kaj la MALLOC_ familio de mediaj variabloj.
.La parametro M_TOP_PAD kontrolas kiom da kroma memoro la asignilo petas preter tio, kio estas tuj bezonata. Agordi ĝin al 0 per mallopt(M_TOP_PAD, 0) diras al la asignanto peti nur tion, kio estas bezonata, reduktante la komencan superkozon signife. La parametro M_MMAP_THRESHOLD kontrolas la grandecon super kiu asignoj uzas mmap anstataŭ la areno. La M_TRIM_THRESHOLD kontrolas kiam liberigita memoro estas resendita al la OS. Kaj ekde glibc 2.26, la agordeblaj glibc.malloc.tcache_count kaj glibc.malloc.tcache_max lasas vin kontroli la fadenkaŝmemorkonduton.
Tamen, zorgema: agordi ĉi tiujn parametrojn sen zorgema benchmarking preskaŭ ĉiam plimalbonigas la aferojn. La defaŭltoj estis elektitaj surbaze de ampleksa real-monda profilado, kaj ili reprezentas dolĉan punkton por la vasta plimulto de laborŝarĝoj. Krom se vi havas fortajn pruvojn de produktadprofilado, ke malloc-superkosto estas proplemkolo - kaj vi mezuris la efikon de viaj ŝanĝoj - lasu la defaŭltojn. Trofrua optimumigo de la asignilo estas precipe insida formo de jaka razado, kiu konsumis sennombrajn inĝenierajn horojn por nekonsiderinda profito.
Kion Ĉi tio Instruas Nin Pri Sistema Programado
La 72 KB unua-asigna mistero estas, en sia kerno, leciono pri abstraktaj tavoloj. C++ donas al vi la iluzion, ke nova int asignas 4 bajtojn. La lingva normo diras tion. Via mensa modelo diras tion. Sed inter via kodo kaj la aparataro sidas stako da kompleksaj sistemoj — la C++ rultempo, la C-biblioteka alsignilo, la virtuala memorsubsistemo de la kerno, kaj la MMU kaj TLB de la aparataro — ĉiu aldonante siajn proprajn kondutojn, optimumojn, kaj superŝarĝon.
Ĉi tio ne estas difekto. Ĝi estas la tuta punkto de sistemaj programoj. Ĉiu tavolo ekzistas por solvi veran problemon: la alsignilo ekzistas do vi ne devas fari sistemajn vokojn por ĉiu asigno. La virtuala memorsistemo ekzistas do vi ne devas administri fizikan memoron rekte. La paĝa faŭltotraktilo ekzistas do memoro estas farita maldiligente kaj efike. Ĉiu tavolo interŝanĝas malgrandan kvanton da travidebleco por granda kvanto de rendimento kaj oportuno.
La programistoj, kiuj konstruas la plej fidindajn, plej altfunkciajn sistemojn, estas tiuj, kiuj komprenas ĉi tiujn tavolojn — ne ĉar ili devas pensi pri ili konstante, sed ĉar kiam okazas io neatendita (kiel mistera 72 KB-atribuo), ili havas la mensan modelon por kompreni kial. Ĉu vi konstruas realtempan komercan sistemon, ludmaŝinon aŭ komercan platformon servantan milojn da uzantoj, la kapablo rezoni pri tio, kion via kodo efektive faras sur la sistemnivelo, estas tio, kio apartigas kompetentajn programistojn de esceptaj. La 72 KB ne estas cimo. Ĝi estas via asignanto, kiu faras sian laboron brile.
Konstruu Vian Komercan OS Hodiaŭ
De sendependaj dungitoj ĝis agentejoj, Mewayz gvidas pli ol 138 000 entreprenojn kun 207 integraj moduloj. Komencu senpage, altgradigu kiam vi kreskos.
Krei Senpaga Konto →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