لماذا يكون التخصيص الأول لـ C++ (m) دائمًا 72 كيلو بايت؟
اكتشف سبب طلب تخصيص ذاكرة C++ الأول لديك 72 كيلو بايت بدلاً من البايتات المتوقعة. استكشف الطبقات الداخلية لـ malloc وطبقات إدارة ذاكرة نظام التشغيل.
Mewayz Team
Editorial Team
اللغز وراء تخصيصك الأول لـ C++
تكتب برنامج C++ بسيط. كثافة العمليات واحدة جديدة. أربعة بايت. تقوم بتشغيل strace أو ملف تعريف الذاكرة المفضل لديك، وها هو - طلبت العملية للتو ما يقرب من 72 كيلو بايت من نظام التشغيل. ليس 4 بايت. ليس 64 بايت. كامل 72 كيلو بايت. إذا سبق لك أن حدقت في هذا الرقم وتساءلت عما إذا كانت أدواتك تكذب عليك، فأنت لست وحدك. يعد هذا السلوك الغريب على ما يبدو أحد الأسئلة الأكثر شيوعًا بين مطوري C++ الذين يبحثون في الأجزاء الداخلية للذاكرة لأول مرة، وتأخذنا الإجابة في رحلة رائعة عبر الطبقات الموجودة بين التعليمات البرمجية الخاصة بك والأجهزة الفعلية.
ماذا يحدث عندما تتصل بجديد
لفهم الرقم 72 كيلو بايت، تحتاج إلى تتبع سلسلة التخصيص الكاملة. عندما ينفذ كود C++ الخاص بك int جديدًا، يقوم المترجم بترجمة ذلك إلى استدعاء عامل التشغيل الجديد، والذي يقوم في معظم أنظمة Linux بتفويض malloc من glibc. لكن malloc لا يطلب مباشرة من النواة 4 بايت من الذاكرة. تعمل النواة في صفحات — عادة 4 كيلو بايت على x86_64 — وتكلفة استدعاء النظام هائلة مقارنة بالوصول البسيط إلى الذاكرة. إن استدعاء brk() أو mmap() لكل تخصيص فردي سيؤدي إلى توقف أي برنامج غير تافه.
وبدلاً من ذلك، يعمل مُخصص الذاكرة الخاص بـ glibc - وهو تطبيق يُسمى ptmalloc2، وهو نفسه منحدر من dlmalloc الكلاسيكي لـ Doug Lea - كوسيط. فهو يطلب كتلًا كبيرة من الذاكرة من النواة مقدمًا، ثم يقسمها إلى أجزاء أصغر حسب احتياج برنامجك إليها. هذا هو السبب الأساسي الذي يجعل تخصيصك الأول لـ 4 بايت يؤدي إلى طلب أكبر بكثير لنظام التشغيل. المُخصص لا يُسرف. لقد أصبحت استراتيجية.
تشريح 72 كيلو بايت: أين تذهب البايتات
يأتي عبء التخصيص الأولي من عدة مكونات مميزة يجب أن يقوم وقت التشغيل بتهيئتها قبل أن يتمكن من تسليمك حتى بايت واحد من الذاكرة القابلة للاستخدام. إن فهم كل مكون يشرح سبب وصول الرقم إلى مكانه.
أولاً، يقوم glibc's malloc بتهيئة الساحة الرئيسية - هيكل مسك الدفاتر الأساسي الذي يتتبع جميع التخصيصات في الخيط الرئيسي. تشتمل هذه الساحة على بيانات تعريف الكومة ومؤشرات القائمة الحرة وهياكل الصناديق لأحجام التخصيص المختلفة. يقوم المُخصص بتوسيع فاصل البرنامج عبر sbrk()، ويخضع الامتداد الأولي لمعلمة داخلية تسمى M_TOP_PAD، والتي تبلغ المساحة الافتراضية 128 كيلو بايت من المساحة المتروكة. ومع ذلك، يتم تعديل الطلب الأولي الفعلي لمحاذاة الصفحة وموضع الفاصل الحالي، مما يؤدي غالبًا إلى طلب أول أصغر حجمًا - عادةً ما يقترب من الرقم 72 كيلو بايت في عملية بدأت حديثًا.
ثانيًا، منذ الإصدار glibc 2.26، يقوم المُخصص بتهيئة ذاكرة التخزين المؤقت لمؤشر الترابط المحلي (tcache) عند الاستخدام الأول. تحتوي ذاكرة التخزين المؤقت على 64 حاوية (واحدة لكل فئة ذات حجم تخصيص صغير)، كل منها قادرة على استيعاب ما يصل إلى 7 قطع مخزنة مؤقتًا. يستهلك tcache_perthread_struct نفسه حوالي 1 كيلوبايت، لكن عملية تهيئته تؤدي إلى إعداد الساحة على نطاق أوسع. ثالثًا، أجرى وقت تشغيل C++ بالفعل عمليات تخصيص قبل تشغيل main() - تساهم المنشئات الثابتة وتهيئة المخزن المؤقت iostream لـ std::cout والأصدقاء وإعداد الإعدادات المحلية في بصمة الكومة الأولية هذه.
نظام الساحة ولماذا يعد التخصيص المسبق ذكيًا
💡 هل تعلم؟
Mewayz تحل محل 8+ أدوات أعمال في منصة واحدة
CRM · الفواتير · الموارد البشرية · المشاريع · الحجوزات · التجارة الإلكترونية · نقطة البيع · التحليلات. خطة مجانية للأبد متاحة.
ابدأ مجانًا →إن قرار التخصيص المسبق لجزء كبير من الذاكرة بدلاً من طلبها بشكل مجزأ ليس من قبيل الصدفة في التنفيذ. إنها مقايضة هندسية متعمدة متجذرة في عقود من الخبرة في برمجة الأنظمة. يتضمن كل استدعاء لـ brk() أو mmap() تبديل السياق من مساحة المستخدم إلى مساحة kernel، وتعديل تعيينات الذاكرة الظاهرية للعملية، وتحديثات جدول الصفحات المحتملة. في الأجهزة الحديثة، تكلف مكالمة نظام واحدة ما يقرب من 100 إلى 200 نانو ثانية - وهي تكلفة تافهة في عزلتها، وكارثية على نطاق واسع.
خذ بعين الاعتبار برنامجًا يقوم بإجراء 10.000 عملية تخصيص صغيرة أثناء التهيئة. وبدون التخصيص المسبق، فإن ذلك يعني 10000 مكالمة للنظام، بتكلفة تبلغ حوالي 1-2 مللي ثانية من النفقات العامة الصافية. باستخدام المُخصص المعتمد على الساحة، يتم تشغيل التخصيص الأول
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 →Related Posts
- أداة العزل في سطر الأوامر في macOS غير المعروفة (2025)
- لماذا أشعر بالقلق بشأن فقدان الوظيفة والأفكار حول الميزة النسبية
- تطبيق طقس للطرفية مع رسوم ASCII متحركة مدعومة ببيانات الطقس الفورية
- Raspberry Pi Pico 2 بتردد 873.5 ميجاهرتز مع إساءة استخدام جهد النواة 3.05 فولت
الأسئلة المتكررة
لماذا يطلب التخصيص الأول في C++ دائمًا 72 كيلو بايت وليس حجم الكائن الفعلي؟
يحدث هذا لأن مُرحِّل C++ (مثل GCC أو Clang) لا يطلب الذاكرة مباشرة من نظام التشغيل في كل مرة تستخدم فيها `new`. بدلاً من ذلك، يقوم أولاً بالطلب من "مانح الذاكرة" (memory allocator) خاص به. هذا المانح هو الذي يحتفظ بمساحات ذاكرة مُسبقة التخصيص (pools) لإدارة الطلبات الصغيرة بكفاءة. التخصيص الأولي (~72 كيلو بايت) هو هذه المساحة المُسبقة التي يُجهزها المانح لخدمة طلباتك المستقبلية بسرعة، مما يقلل من التكلفة البطيئة للطلب المباشر من نظام التشغيل في كل مرة.
ما هي المسؤولية المشتركة بين مُرحِّل C++ ومانح الذاكرة في نظام التشغيل؟
يعمل الاثنان في طبقات مختلفة: مُرحِّل C++ (أو مكتبة الوقت التشغيل مثل libc++) يدير "مانح الذاكرة" الخاص باللغة. هذا المانح مسؤول عن تقسيم الكتل الذاكورية الكبيرة التي يحصل عليها من نظام التشغيل إلى قطع صغيرة تناسب كائناتك. بدوره، فإن مانح الذاكرة في نظام التشغيل (مثل `malloc` في libc) يعمل كوسيط بين برنامجك وال kernel، مُخصصًا صفحات ذاكرة فعلية (عادة 4 كيلو بايت). لذلك، فإن الـ 72 كيلو بايت هي طلب من مانح C++ إلى مانح النظام، وليس مباشرة إلى الـ kernel.
هل يمكنني تغيير حجم الكتلة المخصصة أولياً أو سلوك المانح في C++؟
نعم، يمكن ذلك، لكنه متقدم ويتطلب فهمًا جيدًا لاحتياجات التطبيق الخاص بك. معظم مطوري C++ لا يحتاجون إلى تغيير هذا السلوك الافتراضي لأنه مُحسَّن للأداء العام. إذا كنت تطور نظامًا متخصصًا (مثل أنظمة مضمنة ذات ذاكرة محدودة)، يمكنك استخدام مانح ذاكرة مخصص (custom allocator) أو ضبط بعض معلمات مكتبة الوقت التشغيل. يجب أن تكون حذرًا، لأن التعديل الخاطئ يمكن أن يضر بالأداء بدلاً من تحسينه. أدوات مثل Mewayz (207 وحدة، 19 دولارًا/شهر) قد توفر تحليلات أعمق لسلوك الذاكرة في هذه السيناريوهات.
كيف يؤثر هذا السلوك على أداء برنامجي واستهلاك الذاكرة؟
في المدى القصير، يبدو أن هناك "هدرًا" للذاكرة (72 كيلو بايت لـكائن 4 بايت). لكن على المدى الطويل، هذا الاستراتيجية تزيد الأداء بشكل كبير. طلب ذاكرة من نظام التشغيل عملية بطيئة (system call). بتخزين كتلة كبيرة مسبقًا، يقلل مانح C++ من عدد هذه الطلبات البطيئة. عندما تطلب كائنات جديدة لاحقًا، يتم إعطاؤها من الكتلة المُجهزة مسبقًا بسرعة فائقة. هذه مقايضة كلاسيكية بين الذاكرة والسرعة، وهي مفيدة لمعظم التطبيقات.
Frequently Asked Questions
لماذا لا يخصص C++ ذاكرة بالضبط للحجم الذي أطلبه؟
يخصص مُدير الذاكرة في C++ (مثل المُخصص في مكتبة وقت التشغيل) كتلًا من الذاكرة من نظام التشغيل لتحسين الكفاءة. استدعاء `new` لكل كائن صغير على حدة سيكون بطيئًا جدًا. بدلاً من ذلك، يطلب المُخصص كتلة كبيرة مقدماً (مثل 72 كيلو بايت) ثم يُجزئها لاستيعاب طلباتك الصغيرة لاحقًا. هذا يقلل من عدد المرات التي يحتاج فيها للتواصل مع نواة النظام، مما يجعل التخصيصات أسرع بشكل عام.
هل الرقم 72 كيلو بايت دائم أم أنه قد يختلف؟
الرقم 72 كيلو بايت ليس ثابتًا عالميًا؛ إنه يعتمد على تطبيق المُخصص ومكتبة وقت التشغيل المستخدمة (مثل glibc على Linux). يمكن أن يختلف هذا الحجم المبدئي بناءً على إصدار المكتبة أو إعدادات الترجمة. بالنسبة لمطوري C++ الذين يحتاجون إلى تحليل دقيق ومتسق لسلوك الذاكرة، توفر منصة مثل Mewayz (بما تشمل 207 وحدة تحليل) الرؤية اللازمة لفهم هذه التفاصيل المعتمدة على البيئة.
هل هذا يعني أن برنامجي يهدر 72 كيلو بايت من الذاكرة على الفور؟
ليس بالضرورة. الذاكرة المخصصة من نظام التشغيل (الظاهرة في `strace`) مخصصة لـ "الكتلة الشاملة" للمُخصص. سيستخدم برنامجك هذه الذاكرة تدريجيًا لتلبية طلبات `new` اللاحقة. التخصيص الأولي هو استثمار للحد من النفقات العامة المستقبلية. مع منصة مراقبة مثل Mewayz، يمكنك تتبع استخدام هذه الكتلة بدقة لضمان عدم وجود هدر حقيقي للذاكرة في تطبيقك.
هل يمكنني تغيير حجم هذه الكتلة المخصصة أولاً أو التحكم فيها؟
بشكل عام، لا توجد واجهة قياسية في C++ للتحكم المباشر في حجم الكتلة الأولية التي يطلبها المُخصص الأساسي. هذا السلوك مُنفذ داخليًا في مكتبة وقت التشغيل. بدلاً من ذلك، يمكن للمطورين المتقدمين استخدام مُخصصات ذاكرة مخصصة (Custom Allocators) لتجاوز السلوك الافتراضي والتحكم الدقيق في إستراتيجية التخصيص، وهو أمر مفيد للتطبيقات ذات المتطلبات الخاصة بالأداء.
جرب Mewayz مجانًا
منصة شاملة لإدارة العلاقات والعملاء، والفواتير، والمشاريع، والموارد البشرية، والمزيد. لا حاجة لبطاقة ائتمان.
الحصول على المزيد من المقالات مثل هذا
نصائح الأعمال الأسبوعية وتحديثات المنتج. مجانا إلى الأبد.
لقد اشتركت!
ابدأ في إدارة عملك بشكل أكثر ذكاءً اليوم.
انضم إلى 30,000+ شركة. خطة مجانية للأبد · لا حاجة لبطاقة ائتمان.
هل أنت مستعد لوضع هذا موضع التنفيذ؟
انضم إلى 30,000+ شركة تستخدم ميويز. خطة مجانية دائمًا — لا حاجة لبطاقة ائتمان.
ابدأ التجربة المجانية →مقالات ذات صلة
Hacker News
من مساحة الألوان RGB إلى L*a*b* (2024)
Mar 8, 2026
Hacker News
عرض HN: كيوريوسيتي - تلسكوب نيوتوني عاكس مقاس 6 بوصات يمكنك صنعه بنفسك
Mar 8, 2026
Hacker News
SWE-CI: تقييم قدرات الوكيل في الحفاظ على قواعد التعليمات البرمجية عبر CI
Mar 8, 2026
Hacker News
كيفية تشغيل Qwen 3.5 محليا
Mar 8, 2026
Hacker News
رؤية كبرى للصدأ
Mar 8, 2026
Hacker News
عشر سنوات من النشر في الإنتاج
Mar 8, 2026
هل أنت مستعد لاتخاذ إجراء؟
ابدأ تجربة Mewayz المجانية اليوم
منصة أعمال شاملة. لا حاجة لبطاقة ائتمان.
ابدأ مجانًا →تجربة مجانية 14 يومًا · لا توجد بطاقة ائتمان · إلغاء في أي وقت