การใช้สตริง C ++ Constexpr คืออะไร?
การใช้ constexpr อาจทำให้ไฟล์ปฏิบัติการมีขนาดกะทัดรัดและปรับให้เหมาะสมยิ่งขึ้น เนื่องจากคอมไพเลอร์กำหนดค่าไว้ล่วงหน้า ไบนารีผลลัพธ์ที่ได้อาจมีขนาดเล็กลง ทำให้ใช้ทรัพยากรระบบได้อย่างประหยัดมากขึ้น ซึ่งจะช่วยปรับปรุงประสิทธิภาพของซอฟต์แวร์บนแพลตฟอร์มต่างๆ ได้ ข้อได้เปรียบที่สำคัญเป็นพิเศษประการหนึ่งของคุณสมบัตินี้คือการลดการประมวลผลรันไทม์ เนื่องจากมีการคำนวณค่าระหว่างกระบวนการคอมไพล์เมื่อใดก็ตามที่เป็นไปได้ การประเมินรันไทม์จึงมีความจำเป็นน้อยลง การเพิ่มประสิทธิภาพนี้ไม่เพียงแต่ช่วยเร่งการดำเนินการเท่านั้น แต่ยังช่วยปรับปรุงการทำงานของโปรแกรมโดยรวมอีกด้วย
ตัวอย่างที่ 1: การใช้ Constexpr ใน C++ สำหรับการคำนวณแฟกทอเรียล
ในตัวอย่างนี้ เราจะใช้ constexpr ซึ่งอนุญาตให้ทำการคำนวณในเวลาคอมไพล์ แทนที่จะเป็นรันไทม์ ในบริบทของการคำนวณแฟกทอเรียล สามารถใช้การดำเนินการทางคณิตศาสตร์ทั่วไปที่เรียกว่า constexpr เพื่อคำนวณค่าแฟกทอเรียลระหว่างการคอมไพล์ได้ มาตรวจสอบและทบทวนโค้ดต่อไปนี้แล้วดูคำอธิบายของโค้ด:
#รวม
บริบท ภายใน แฟกทอเรียล - ภายใน n - -
กลับ n - 1 - 1 - - n - แฟกทอเรียล - n - 1 - - -
-
ภายใน หลัก - - -
ภายใน หนึ่ง - 5 -
มาตรฐาน - ศาล - 'แฟกทอเรียลของ' - หนึ่ง - - - แฟกทอเรียล - หนึ่ง - - มาตรฐาน - สิ้นสุด -
-
ตัวอย่างโค้ดที่กำหนดแสดงให้เห็นถึงการใช้ constexpr ในการคำนวณแฟกทอเรียลของตัวเลขในลักษณะวนซ้ำ คอมไพลเลอร์สามารถประเมินนิพจน์แฟกทอเรียลในเวลาคอมไพล์ในตัวอย่างนี้ เนื่องจากมีการประกาศและกำหนดฟังก์ชันแฟกทอเรียลด้วยตัวระบุ constexpr การใช้ constexpr ในโปรแกรม C++ คอมไพลเลอร์จะประเมินนิพจน์แฟกทอเรียลที่ 5 ในเวลาคอมไพล์ ซึ่งช่วยลดความจำเป็นในการคำนวณรันไทม์
ตอนนี้ให้เราดูรายละเอียดรายละเอียดของโค้ดพร้อมรายละเอียดและคำอธิบายเฉพาะ
ขั้นแรก เราใช้ #include
หลังจากนั้น เราจะย้ายไปยังฟังก์ชัน factorial() (เรียกซ้ำ) ซึ่งก็คือ 'constexpr int factorial(int n)' ฟังก์ชัน factorial() นี้กำหนดฟังก์ชันแบบเรียกซ้ำที่คำนวณแฟกทอเรียลของจำนวนเต็ม 'n' Constexpr บอกเป็นนัยว่าการปรับประสิทธิภาพให้เหมาะสมที่สุดอาจเป็นผลมาจากการประเมินฟังก์ชันระหว่างการคอมไพล์
การส่งคืน n <= 1 ? 1 : (n * factorial(n – 1)) บรรทัดใช้นิพจน์แบบมีเงื่อนไขสำหรับการเรียกซ้ำซึ่งระบุว่าถ้า 'n' น้อยกว่าหรือเท่ากับ 1 ก็จะส่งกลับ 1 (กรณีฐาน) ถ้าไม่เช่นนั้น ก็จะคำนวณแฟกทอเรียล (n! = n * (n-1)!) ซึ่งเป็นสูตรทั่วไปในการคำนวณแฟกทอเรียล โดยเรียกตัวเองซ้ำๆ ว่า 'n – 1' แล้วคูณผลลัพธ์ด้วย 'n '. เส้นเหล่านี้ทำหน้าที่เหมือนกับตัวเฝ้าประตูสำหรับการคำนวณแฟกทอเรียล จะตรวจสอบว่าตัวเลขอยู่ที่ระดับฐานหรือไม่ และส่งคืนค่า 1 หากเป็นเช่นนั้น ถ้าไม่เช่นนั้น มันจะเริ่มต้นปฏิกิริยาลูกโซ่ของการเรียกใช้ฟังก์ชัน โดยแต่ละอันทำงานกับตัวเลขที่น้อยกว่าจนกว่าจะถึงกรณีพื้นฐาน จากนั้นนำผลลัพธ์มาคูณกันในลำดับย้อนกลับ ต่อไปนี้เป็นผลลัพธ์ของโค้ดสำหรับการอ้างอิงของคุณ:
ตัวอย่างที่ 2: การนับตัวอักษรตัวพิมพ์เล็กที่สาธิตสตริง C ++ Constexpr
ที่นี่ เราจะเรียนรู้วิธีนับจำนวนตัวอักษรพิมพ์เล็กโดยใช้สตริง countexpr ในตัวอย่างนี้ จุดประสงค์คือการนับจำนวนตัวอักษรตัวพิมพ์เล็กในสตริงที่กำหนดโดยใช้คุณลักษณะ constexpr เพื่อลดการคำนวณรันไทม์ ฟังก์ชัน countLowercase() ซึ่งประกาศเป็น constexpr ใช้สตริง “string_view” เป็นพารามิเตอร์และวนซ้ำอักขระแต่ละตัวของสตริงที่กำหนดเป็นอินพุต สำหรับอักษรตัวพิมพ์เล็กทุกตัวที่เราพบ การนับจะเพิ่มขึ้น จากนั้นจะได้รับผลลัพธ์ในเวลาคอมไพล์เมื่อฟังก์ชันดำเนินการกับนิพจน์คงที่ ซึ่งแสดงให้เห็นประสิทธิภาพและประโยชน์ของการประเมินเวลาคอมไพล์ ขั้นแรก ตรวจสอบรหัสต่อไปนี้ จากนั้นไปที่คำอธิบายโดยละเอียด:
#รวม#รวม
ใช้เนมสเปซมาตรฐาน -
บริบท ขนาด_t นับตัวพิมพ์เล็ก - string_view เอส - -
ขนาด_t นับ - 0 -
สำหรับ - ถ่าน ค - ส - -
ถ้า - ต่ำกว่า - ค - - -
นับ -
-
-
กลับ นับ -
-
ภายใน หลัก - - -
ศาล - 'อักษรตัวพิมพ์เล็กทั้งหมดใน ' กรณี LeTtErS ต่ำ ' คือ = '
- นับตัวพิมพ์เล็ก - 'กรณี LeTtErS ต่ำ' - - สิ้นสุด -
-
นี่คือรายละเอียดรายละเอียดของโค้ดพร้อมคำอธิบายของแต่ละบรรทัด:
#include
ในฟังก์ชัน countLowercase() ฟังก์ชัน 'constexpr size_t countlower(string_view s)' จะนับตัวอักษรตัวพิมพ์เล็กในมุมมองสตริงที่กำหนด int main() คือจุดเริ่มต้นของโปรแกรมที่พิมพ์ข้อความที่ระบุจำนวนตัวอักษรตัวพิมพ์เล็กใน “LoWeR CaSe LeTtErS” และเรียกใช้ฟังก์ชัน countLowercase() โดยมี “LoWeR CaSe LeTtErS” เป็นอินพุตและพิมพ์ผลลัพธ์ อ้างถึงผลลัพธ์ของโปรแกรมต่อไปนี้:
ตัวอย่างที่ 3: การสาธิตอาร์เรย์โดยใช้ C++ Constexpr
การสาธิตอาร์เรย์จะแสดงวิธีการสร้าง เข้าถึง และจัดการอาร์เรย์ที่เป็นคอลเลกชันที่มีโครงสร้างขององค์ประกอบประเภทข้อมูลเดียวกันภายในภาษาการเขียนโปรแกรม ต่อไปนี้ เราจะอธิบายผ่านตัวอย่างการเขียนโค้ด โดยที่โปรแกรมให้ตัวอย่างง่ายๆ ของการกำหนดค่าเริ่มต้นและการจัดการอาร์เรย์เวลาคอมไพล์
การสาธิตอาร์เรย์จะแสดงแนวคิดของอาร์เรย์ ซึ่งเป็นคอลเลกชันที่มีโครงสร้างขององค์ประกอบที่ใช้ข้อมูลประเภทเดียวกัน และวิธีการสร้าง เข้าถึง และจัดการโดยใช้ภาษาการเขียนโปรแกรม ในตัวอย่างการเขียนโค้ดต่อไปนี้ เราจะสาธิตวิธีการเริ่มต้นอาร์เรย์ในเวลาคอมไพล์ คำนวณขนาดของอาร์เรย์ และพิมพ์องค์ประกอบของอาร์เรย์ที่กำหนด ดูรหัสที่ระบุต่อไปนี้และดำเนินการตามคำอธิบาย:
#รวมใช้เนมสเปซมาตรฐาน -
ภายใน หลัก - - -
บริบท ภายใน อาร์เรย์ - 9 - - - 5 - 55 - 555 - 5555 - 55555 - -
บริบท ภายใน ขนาด_อาร์เรย์ - ขนาดของ อาร์เรย์ - ขนาดของ - ภายใน - -
ศาล - 'ความยาวของอาร์เรย์คือ = ' - ขนาด_อาร์เรย์ - สิ้นสุด -
ศาล - 'องค์ประกอบในอาร์เรย์คือ = ' -
สำหรับ - ภายใน ฉัน - 0 - ฉัน - ขนาด_อาร์เรย์ - - ฉัน - -
ศาล - อาร์เรย์ - ฉัน - - - -
-
-
โปรแกรมนี้เริ่มต้นอาร์เรย์ constexpr คำนวณความยาว ณ เวลาคอมไพล์ จากนั้นพิมพ์ความยาวและองค์ประกอบของอาร์เรย์ไปยังคอนโซล Constexpr ทำให้แน่ใจว่าอาร์เรย์และคุณสมบัติต่างๆ ถูกกำหนด ณ เวลาคอมไพล์ มาทำลายโค้ดและอธิบายรายละเอียดเฉพาะทีละรายการ:
หากต้องการรวมไลบรารีสตรีมอินพุต-เอาต์พุตมาตรฐาน ซึ่งอนุญาตให้ใช้ฟังก์ชัน เช่น 'cout' สำหรับเอาต์พุต ให้เรียก #include
ลูป “for” จะวนซ้ำผ่านองค์ประกอบของอาร์เรย์ “arrayint[]” จากนั้นค่าต่างๆ จะถูกพิมพ์ลงบนคอนโซล ให้เราดูผลลัพธ์ต่อไปนี้ของโค้ดที่กำหนด:
บทสรุป
การแนะนำและวิวัฒนาการของคีย์เวิร์ด constexpr ใน C++ ได้ปฏิวัติวิธีการจัดการนิพจน์และค่าคงที่ บทความนี้สำรวจตัวอย่างเชิงปฏิบัติสามตัวอย่าง โดยแสดงพลังของ constexpr ในการคำนวณแฟกทอเรียล การนับตัวอักษรตัวพิมพ์เล็ก และการเริ่มต้นอาร์เรย์ในเวลาคอมไพล์ ประเด็นสำคัญ ได้แก่ ประสิทธิภาพที่เพิ่มขึ้น การคำนวณรันไทม์ที่ลดลง และประสิทธิภาพของหน่วยความจำที่ดีขึ้น Constexpr เป็นทรัพย์สินที่มีค่าสำหรับการสร้างเอนทิตีที่เชื่อถือได้และคงที่ภายในโค้ดเบส ช่วยให้มั่นใจถึงความไม่เปลี่ยนแปลง และมีส่วนทำให้โปรแกรมมีความคล่องตัวและมีประสิทธิภาพมากขึ้น