Hacker News

Mengapakah peruntukan C++ (m) pertama sentiasa 72 KB?

Temui sebab peruntukan memori C++ pertama anda meminta 72 KB dan bukannya bait yang dijangkakan. Terokai dalaman malloc dan lapisan pengurusan memori OS yang dijelaskan.

5 min bacaan

Mewayz Team

Editorial Team

Hacker News

Misteri Di Sebalik Peruntukan C++ Pertama Anda

Anda menulis program C++ yang mudah. Satu int baharu. Empat bait. Anda menyalakan strace atau pemprofil memori kegemaran anda, dan itu adalah - proses anda hanya meminta kira-kira 72 KB daripada sistem pengendalian. Bukan 4 bait. Bukan 64 bait. 72 KB penuh. Jika anda pernah melihat nombor itu dan tertanya-tanya sama ada alat anda berbohong kepada anda, anda tidak bersendirian. Tingkah laku yang kelihatan pelik ini ialah salah satu soalan yang paling kerap ditanya dalam kalangan pembangun C++ yang mencari dalaman memori buat kali pertama, dan jawapannya membawa kita ke perjalanan yang menarik melalui lapisan yang terletak di antara kod anda dan perkakasan sebenar.

Perkara yang Berlaku Apabila Anda Panggil baharu

Untuk memahami angka 72 KB, anda perlu mengesan rantaian peruntukan penuh. Apabila kod C++ anda melaksanakan int baharu, pengkompil menterjemahkannya ke dalam panggilan kepada operator baharu, yang pada kebanyakan sistem Linux mewakilkan kepada malloc daripada glibc. Tetapi malloc tidak meminta kernel untuk 4 bait memori secara langsung. Kernel beroperasi dalam halaman - biasanya 4 KB pada x86_64 - dan kos panggilan sistem adalah sangat besar berbanding dengan akses memori yang mudah. Memanggil brk() atau mmap() untuk setiap peruntukan individu akan membuat sebarang program bukan remeh terhenti.

Sebaliknya, pengalokasi memori glibc — pelaksanaan yang dipanggil ptmalloc2, sendiri berasal dari dlmalloc klasik Doug Lea — bertindak sebagai orang tengah. Ia meminta blok memori yang besar dari kernel di hadapan, kemudian mengukirnya menjadi kepingan yang lebih kecil kerana program anda memerlukannya. Inilah sebab asas peruntukan 4-bait pertama anda mencetuskan permintaan yang lebih besar kepada sistem pengendalian. Pengagih tidak membazir. Ia adalah strategik.

Membedah 72 KB: Where the Bytes Go

Overhed peruntukan awal datang daripada beberapa komponen berbeza yang mesti dimulakan oleh masa jalan sebelum ia boleh memberikan anda walaupun satu bait memori yang boleh digunakan. Memahami setiap komponen menerangkan sebab nombor itu sampai ke tempat ia berlaku.

Pertama, malloc glibc memulakan arena utama — struktur simpan kira utama yang menjejaki semua peruntukan pada urutan utama. Arena ini termasuk metadata untuk timbunan, penunjuk senarai percuma dan struktur tong untuk saiz peruntukan yang berbeza. Pengagih memanjangkan pemecahan program melalui sbrk(), dan sambungan awal dikawal oleh parameter dalaman yang dipanggil M_TOP_PAD, yang lalai kepada 128 KB padding. Walau bagaimanapun, permintaan awal sebenar dilaraskan untuk penjajaran halaman dan kedudukan pemisah sedia ada, yang selalunya menghasilkan permintaan pertama yang lebih kecil — biasanya mendarat berhampiran angka 72 KB pada proses yang baru dimulakan.

💡 ADAKAH ANDA TAHU?

Mewayz menggantikan 8+ alat perniagaan dalam satu platform

CRM · Pengebilan · HR · Projek · Tempahan · eCommerce · POS · Analitik. Pelan percuma selama-lamanya tersedia.

Mula Percuma →

Kedua, sejak glibc 2.26, pengalokasi memulakan cache setempat-benang (tcache) pada penggunaan pertama. Tcache mengandungi 64 tong (satu bagi setiap kelas saiz peruntukan kecil), setiap satu mampu menampung sehingga 7 ketulan cache. Tcache_perthread_struct itu sendiri menggunakan sekitar 1 KB, tetapi tindakan memulakannya mencetuskan persediaan arena yang lebih luas. Ketiga, masa jalan C++ telah pun melaksanakan peruntukan sebelum main() anda berjalan — pembina statik, permulaan penimbal iostream untuk std::cout dan rakan, dan persediaan setempat semuanya menyumbang kepada jejak timbunan awal itu.

Sistem Arena dan Mengapa Pra-Peruntukan Adalah Pintar

Keputusan untuk pra-peruntukkan sebahagian besar memori dan bukannya memintanya sedikit demi sedikit bukanlah satu kemalangan pelaksanaan. Ia adalah pertukaran kejuruteraan yang disengajakan yang berakar umbi dalam pengalaman pengaturcaraan sistem selama beberapa dekad. Setiap panggilan ke brk() atau mmap() melibatkan penukaran konteks daripada ruang pengguna ke ruang kernel, pengubahsuaian pemetaan memori maya proses dan kemungkinan kemas kini jadual halaman. Pada perkakasan moden, panggilan sistem tunggal menelan kos kira-kira 100-200 nanosaat — remeh dalam pengasingan, malapetaka pada skala.

Pertimbangkan program yang membuat 10,000 peruntukan kecil semasa permulaan. Tanpa praperuntukan, ini bermakna 10,000 panggilan sistem, menelan belanja kira-kira 1-2 milisaat overhed tulen. Dengan pengagih berasaskan arena, pencetus peruntukan pertama

Build Your Business OS Today

From freelancers to agencies, Mewayz powers 138,000+ businesses with 207 integrated modules. Start free, upgrade when you grow.

Create Free Account →

Frequently Asked Questions

Apakah sebenarnya yang menggunakan 72 KB itu?

Peruntukan 72 KB itu bukan untuk pembolehubah `int` anda. Sebaliknya, ia adalah permintaan memori daripada pengendalian perpustakaan standard C++ (biasanya `glibc`) untuk menyediakan "arena" heap peringkat aplikasinya. Arena ini berfungsi sebagai longgokan memori permulaan untuk pengurus memori C++ (`malloc`/`new`) untuk menguruskan semua peruntukan dinamik masa hadapan dengan lebih cekap, mengurangkan bilangan panggilan sistem yang mahal kepada kernel.

Adakah jumlah 72 KB ini sentiasa tepat?

Tidak, ia boleh berbeza-beza. Nilai 72 KB adalah tipikal untuk sistem Linux moden dengan `glibc`, tetapi saiz tepatnya bergantung pada versi pustaka C, konfigurasi sistem, dan platform. Sebagai contoh, pada sistem yang berbeza atau dengan pengurus memori yang lain, jumlah permulaan ini mungkin lebih kecil atau lebih besar. Ia adalah nilai yang dioptimumkan untuk keseimbangan antara penggunaan memori dan prestasi.

Mengapa perpustakaan tidak meminta memori yang lebih kecil dahulu?

Meminta blok memori yang lebih besar (72 KB) pada mulanya adalah strategi pengoptimuman. Panggilan sistem untuk memetakan memori adalah operasi yang mahal. Dengan mendapatkan "cawan" memori yang lebih besar sekaligus, pengurus memori mengelakkan daripada melakukan panggilan sistem yang kerap untuk setiap peruntukan kecil seterusnya, yang meningkatkan prestasi keseluruhan program dengan ketiga.

Bagaimana saya boleh menganalisis penggunaan memori dengan lebih lanjut?

Untuk analisis yang mendalam mengenai tingkah laku memori dalam aplikasi C++ anda, pertimbangkan untuk menggunakan alat profil memori khusus. Sebagai contoh, platform **Mewayz** menawarkan 207 modul termasuk alatan untuk pemantauan prestasi dan memori, membolehkan anda menjejaki peruntukan dengan tepat dan mengenal pasti kebocoran memori. Dengan harga $19 sebulan, ia menyediakan pandangan yang berharga untuk pengoptimuman pada tahap yang lebih mendalam.

Cuba Mewayz Percuma

Platform semua-dalam-satu untuk CRM, pengebilan, projek, HR & banyak lagi. Kad kredit tidak diperlukan.

Mula menguruskan perniagaan anda dengan lebih bijak hari ini

Sertai 30,000+ perniagaan. Pelan percuma selama-lamanya · Kad kredit tidak diperlukan.

Jumpa ini berguna? Kongsikannya.

Bersedia untuk mempraktikkannya?

Sertai 30,000+ perniagaan yang menggunakan Mewayz. Pelan percuma selama-lamanya — kad kredit tidak diperlukan.

Start Free Trial →

Bersedia untuk mengambil tindakan?

Mulakan percubaan Mewayz percuma anda hari ini

Platform perniagaan all-in-one. Tiada kad kredit diperlukan.

Mula Percuma →

Percubaan percuma 14 hari · Tiada kad kredit · Batal bila-bila masa