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

consteval และ constinit

คีย์เวิร์ดสมัยใหม่สำหรับเวลาคอมไพล์

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

นอกเหนือจาก constexpr

C++20 เพิ่มคีย์เวิร์ดอีกสองคำที่ช่วยให้การเขียนโปรแกรมระหว่างคอมไพล์ชัดเจนขึ้น ได้แก่ consteval สำหรับฟังก์ชันที่รับประกันว่าจะทำงานระหว่างคอมไพล์ และ constinit สำหรับการเริ่มต้นค่าที่รับประกันว่าจะเกิดขึ้นระหว่างคอมไพล์

consteval: ฟังก์ชันที่ทำงานทันที

ฟังก์ชัน consteval ต้องได้รับการประเมินผลในเวลาคอมไพล์ แตกต่างจาก constexpr ตรงที่ไม่สามารถทำงานขณะรันไทม์ได้เลย

consteval int cube(int x) {
    return x * x * x;
}

int main() {
    constexpr int c = cube(3);   // OK: compile time
    return c;
}

consteval ปฏิเสธการเรียกขณะรันไทม์

การเรียกฟังก์ชัน consteval ด้วยค่าที่ทราบขณะรันไทม์จะทำให้เกิดข้อผิดพลาดระหว่างคอมไพล์ โดยมีการบังคับใช้คำรับประกันนี้

consteval int cube(int x) { return x * x * x; }

int main() {
    int n = 4;
    // int bad = cube(n);   // ERROR: n is not a constant
    return cube(2);
}

เหตุใดจึงใช้ consteval

ใช้คำนี้เมื่อการคำนวณไม่ควรเกิดขึ้นขณะรันไทม์ เช่น การสร้างตารางค่าคงที่หรือการตรวจสอบค่าลิเทอรัลระหว่างคอมไพล์

constexpr กับ consteval

ฟังก์ชัน constexpr อาจทำงานระหว่างคอมไพล์ ส่วนฟังก์ชัน consteval ต้องทำเช่นนั้นเสมอ เลือกใช้ consteval เพื่อห้ามการนำไปใช้ขณะรันไทม์โดยไม่ได้ตั้งใจ

constinit: การเริ่มต้นค่าคงที่ของตัวแปรสแตติกที่รับประกัน

constinit รับประกันว่าตัวแปรสแตติกหรือตัวแปรเฉพาะเธรดจะถูกเริ่มต้นค่าในเวลาคอมไพล์ จึงกำจัดปัญหาลำดับการเริ่มต้นค่าของตัวแปรสแตติกได้

constinit int globalCount = 10;   // initialized at compile time

int main() {
    return globalCount;
}

constinit ไม่ใช่ const

แตกต่างจาก constexpr ตรงที่ตัวแปร constinit ยังสามารถแก้ไขได้หลังจากเริ่มต้นค่าในเวลาคอมไพล์แล้ว คำนี้จำกัดเฉพาะวิธีการเริ่มต้นค่าเท่านั้น

constinit int counter = 0;

int main() {
    counter = 5;   // OK: constinit allows mutation
    return counter;
}

แก้ปัญหาลำดับการเริ่มต้นค่า

สำหรับตัวแปรสแตติกที่ไม่ใช่ตัวแปรเฉพาะที่และอยู่ต่างหน่วยแปล constinit จะบังคับให้เริ่มต้นค่าแบบสแตติก หรือระหว่างคอมไพล์ ทำให้ค่าพร้อมใช้งานก่อนการเริ่มต้นค่าแบบไดนามิกใด ๆ

เปรียบเทียบคีย์เวิร์ดทั้งสาม

constexpr: อาจทำงานระหว่างคอมไพล์และเป็นค่าคงที่ consteval: ต้องทำงานระหว่างคอมไพล์สำหรับฟังก์ชัน constinit: บังคับให้เริ่มต้นค่าระหว่างคอมไพล์ แต่ค่าหลังจากนั้นยังเปลี่ยนแปลงได้

การรองรับของคอมไพเลอร์

ฟีเจอร์เหล่านี้เป็นฟีเจอร์ของ C++20 ให้คอมไพล์ด้วย -std=c++20 หรือใหม่กว่าบน GCC/Clang หรือใช้ /std:c++20 บน MSVC

เลือกเครื่องมือที่เหมาะสม

เลือกใช้ consteval เพื่อบังคับการคำนวณระหว่างคอมไพล์ และใช้ constinit เพื่อทำให้การเริ่มต้นค่าตัวแปรสแตติกมีพฤติกรรมแน่นอน ทั้งสองคำทำให้ C++ ระหว่างคอมไพล์ปลอดภัยยิ่งขึ้น

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับ consteval และ constinit ของคุณ

สรุปทบทวน

คุณได้เรียนรู้คีย์เวิร์ด C++20 ได้แก่ consteval ซึ่งใช้กับฟังก์ชันที่ต้องทำงานระหว่างคอมไพล์ และ constinit ซึ่งรับประกันการเริ่มต้นค่าตัวแปรสแตติกระหว่างคอมไพล์ แต่ค่าดังกล่าวยังเปลี่ยนแปลงได้ เมื่อใช้ร่วมกับ constexpr ทั้งสามคำช่วยให้ควบคุมการประเมินผลระหว่างคอมไพล์ได้อย่างแม่นยำ

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

บทเรียน “consteval และ constinit” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “consteval และ constinit”

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

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

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

บทเรียน “consteval และ constinit” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ตัวแปรและพารามิเตอร์ const
  2. ฟังก์ชันสมาชิก const
  3. constexpr และเวลาคอมไพล์
  4. consteval และ constinit
← กลับไปที่ C++ Academy