0Pricing
C++ Academy · บทเรียน

การจัดสรรเฟรมคอร์ูทีน

วิเคราะห์การจัดสรรเฟรมคอร์ูทีนและอายุการใช้งานของเฟรม

การจัดสรรเฟรมคอร์ูทีน เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

สถานะอยู่ที่ใด

ตัวแปรเฉพาะที่ในโครูทีนยังคงอยู่ข้ามช่วงการหยุดชั่วคราวได้ ตัวแปรเหล่านี้ไม่สามารถอยู่บนสแตกได้ เพราะฟังก์ชันจะคืนค่าระหว่างช่วงการหยุดชั่วคราว แต่จะอยู่ใน เฟรมโครูทีน ที่จัดสรรบนฮีปแทน

เฟรมประกอบด้วยอะไรบ้าง

เฟรมเก็บสิ่งต่อไปนี้ไว้:

  • พารามิเตอร์ของโครูทีน
  • ออบเจ็กต์คำสัญญา
  • ตัวแปรเฉพาะที่ที่ยังคงอยู่ข้ามช่วงการหยุดชั่วคราว
  • พอยน์เตอร์ฟังก์ชันสำหรับทำงานต่อและทำลาย

ต้นทุนการจัดสรรบนฮีป

การเรียกโครูทีนแต่ละครั้งจะจัดสรรเฟรมหนึ่งเฟรม การจัดสรรไม่ได้ไม่มีต้นทุน ซึ่งมีความสำคัญสำหรับโครูทีนที่ถูกเรียกใช้บ่อย คอมไพเลอร์ที่ปรับให้เหมาะสมอาจตัดการจัดสรรออกได้เมื่อสามารถจำกัดอายุการใช้งานได้ ซึ่งเรียกว่า HALO (การปรับให้เหมาะสมด้วยการตัดการจัดสรรฮีปออก)

เมื่อ 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) เมื่อทำได้ ตัวจัดสรรแบบกำหนดเองและพูลเฟรมช่วยระบบที่ต้องรองรับปริมาณงานสูง แต่โค้ดส่วนใหญ่ไม่จำเป็นต้องกังวลเรื่องนี้

คำถามที่พบบ่อย

บทเรียน “การจัดสรรเฟรมคอร์ูทีน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดสรรเฟรมคอร์ูทีน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดสรรเฟรมคอร์ูทีน”

วิเคราะห์การจัดสรรเฟรมคอร์ูทีนและอายุการใช้งานของเฟรม คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การจัดสรรเฟรมคอร์ูทีน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนวคิดคอร์ูทีน co_await co_yield co_return
  2. การสร้างเจเนอเรเตอร์อย่างง่าย
  3. งานอะซิงโครนัสและชนิด Awaiter
  4. การจัดสรรเฟรมคอร์ูทีน
← กลับไปที่ C++ Academy