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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวแปรและพารามิเตอร์ const
- ฟังก์ชันสมาชิก const
- constexpr และเวลาคอมไพล์
- consteval และ constinit