0Pricing
C++ Academy · درس

تخصيص إطار Coroutine

فكّر في تخصيص إطار Coroutine وعمره.

تخصيص إطار Coroutine درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

أين توجد الحالة

تستمر المتغيرات المحلية في الكوروتين عبر نقاط التعليق. ولا يمكن أن تعيش على المكدس، إذ تعود الدالة بين نقاط التعليق. وبدلًا من ذلك، تعيش في إطار كوروتين مخصّص على الكومة.

ما الذي يحتويه الإطار

يحتوي الإطار على:

  • معلمات الكوروتين
  • كائن الوعد
  • المتغيرات المحلية التي تستمر عبر نقاط التعليق
  • مؤشري دالتي الاستئناف والتدمير

تكلفة التخصيص على الكومة

يخصّص كل استدعاء للكوروتين إطارًا. والتخصيصات ليست مجانية، وهو أمر مهم للكوروتينات عالية التواتر. قد تلغي المترجمات المحسّنة هذا التخصيص عندما يكون العمر الافتراضي محدودًا، ويُعرف ذلك باسم HALO (Heap Allocation eLision Optimization).

متى يبدأ HALO بالعمل

قد يتجنب المترجم التخصيص على الكومة عندما:

  • يمكن إثبات أن عمر الكوروتين الافتراضي محصور
  • يمكن للإدراج البرمجي إثبات أن الإطار يتسع على المكدس
  • يكون حجم الإطار ثابتًا وقت الترجمة

المخصّصات المخصصة

يمكنكم توفير مخصّصات مخصصة لإطارات الكوروتين عن طريق تحميل operator new بشكل زائد داخل نوع الوعد.

struct promise_type {
    void* operator new(size_t size) {
        return std::malloc(size);
    }
    void operator delete(void* ptr) {
        std::free(ptr);
    }
};

تجمعات الإطارات

في الأنظمة غير المتزامنة ذات معدل المعالجة المرتفع، خصّصوا الإطارات من تجمع لتجنب العبء الإضافي للمخصّص العام. ويمكن أن يكون لكل خيط أو نوع مهمة تجمعه الخاص.

حجم الإطار

يعتمد حجم الإطار على أكبر مجموعة من المتغيرات التي قد تبقى حية عبر أي نقطة تعليق. تؤدي إضافة مزيد من المتغيرات المحلية إلى زيادة حجمه.

تقليل حجم الإطار

نصائح:

  • قيّد نطاق المتغيرات بإحكام
  • تجنب المصفوفات المحلية الكبيرة، واستخدم الكومة صراحةً
  • انقل القيم المؤقتة إلى دوال مساعدة منفصلة غير مخصّصة للكوروتينات

فحص الإطارات

يمكن للمترجمات طباعة أحجام الإطارات. مع clang، استخدموا -fcoro-aligned-allocation وافحصوا النتائج عبر خيارات التشخيص. ويكشف التفكيك عن تخطيط الإطار.

العمر الافتراضي والتنظيف

يُدمَّر إطار الكوروتين عند انتهاء final_suspend، أو قبل ذلك إذا دُمّر صراحةً. وتُدمَّر أعضاء RAII بشكل صحيح.

أمان الذاكرة

مقبض الكوروتين هو مؤشر خام. ويؤدي الاحتفاظ به بعد تدمير الكوروتين إلى سلوك غير معرّف. وتغلّف أنواع المكتبة المقابض داخل RAII لمنع ذلك.

متى ينبغي القلق

لا تحتاج معظم التطبيقات إلى التفكير في تخصيص الإطارات. لا تقلقوا إلا عند استخدام ملايين الكوروتينات أو وجود قيود أداء شديدة. ابدؤوا بتحليل الأداء أولًا.

تحقق سريع

لماذا يعيش إطار الكوروتين عادةً على الكومة؟

مراجعة

تخصّص الكوروتينات إطارًا على الكومة للحفاظ على الحالة عبر نقاط التعليق. ويمكن للمترجمات إلغاء التخصيص (HALO) عندما يكون ذلك ممكنًا. وتساعد المخصّصات المخصصة وتجمعات الإطارات في الأنظمة ذات معدل المعالجة المرتفع، لكن معظم الشفرات لا تحتاج إلى القلق بشأن ذلك.

الأسئلة الشائعة

هل درس «تخصيص إطار Coroutine» مجاني؟

نعم — نص درس «تخصيص إطار Coroutine» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «تخصيص إطار Coroutine»؟

فكّر في تخصيص إطار Coroutine وعمره. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تخصيص إطار Coroutine»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مفاهيم Coroutines: ‏co_await وco_yield وco_return
  2. تنفيذ مولّد بسيط
  3. المهام غير المتزامنة وأنواع Awaiter
  4. تخصيص إطار Coroutine
← العودة إلى C++ Academy