ตัวอย่างสตริง C ++ Constexpr

Tawxyang String C Constexpr



บทความนี้จะกล่าวถึงเกี่ยวกับ constexpr ซึ่งเป็นส่วนเสริมที่โดดเด่นของภาษาการเขียนโปรแกรม C++ ที่นำมาใช้ใน C++11 และปรับปรุงเพิ่มเติมใน C++14 และส่งสัญญาณไปยังคอมไพเลอร์ว่าตัวแปร ฟังก์ชัน หรือตัวสร้างอ็อบเจ็กต์เป็นตัวคอมไพล์- เวลาคงที่ มันปฏิวัติวิธีที่นักพัฒนาสร้างและจัดการค่าคงที่ นักพัฒนาสามารถกำหนดนิพจน์และค่าที่ไม่เปลี่ยนรูปและได้รับการประเมินในระหว่างการคอมไพล์ผ่าน constexpr แทนที่จะกำหนดที่รันไทม์ ประโยชน์โดยรวมของการรวม constexpr เข้ากับโค้ดคือการรับประกันความสม่ำเสมอ

การใช้สตริง C ++ Constexpr คืออะไร?

การใช้ constexpr อาจทำให้ไฟล์ปฏิบัติการมีขนาดกะทัดรัดและปรับให้เหมาะสมยิ่งขึ้น เนื่องจากคอมไพเลอร์กำหนดค่าไว้ล่วงหน้า ไบนารีผลลัพธ์ที่ได้อาจมีขนาดเล็กลง ทำให้ใช้ทรัพยากรระบบได้อย่างประหยัดมากขึ้น ซึ่งจะช่วยปรับปรุงประสิทธิภาพของซอฟต์แวร์บนแพลตฟอร์มต่างๆ ได้ ข้อได้เปรียบที่สำคัญเป็นพิเศษประการหนึ่งของคุณสมบัตินี้คือการลดการประมวลผลรันไทม์ เนื่องจากมีการคำนวณค่าระหว่างกระบวนการคอมไพล์เมื่อใดก็ตามที่เป็นไปได้ การประเมินรันไทม์จึงมีความจำเป็นน้อยลง การเพิ่มประสิทธิภาพนี้ไม่เพียงแต่ช่วยเร่งการดำเนินการเท่านั้น แต่ยังช่วยปรับปรุงการทำงานของโปรแกรมโดยรวมอีกด้วย

ตัวอย่างที่ 1: การใช้ Constexpr ใน C++ สำหรับการคำนวณแฟกทอเรียล

ในตัวอย่างนี้ เราจะใช้ constexpr ซึ่งอนุญาตให้ทำการคำนวณในเวลาคอมไพล์ แทนที่จะเป็นรันไทม์ ในบริบทของการคำนวณแฟกทอเรียล สามารถใช้การดำเนินการทางคณิตศาสตร์ทั่วไปที่เรียกว่า constexpr เพื่อคำนวณค่าแฟกทอเรียลระหว่างการคอมไพล์ได้ มาตรวจสอบและทบทวนโค้ดต่อไปนี้แล้วดูคำอธิบายของโค้ด:







#รวม

บริบท ภายใน แฟกทอเรียล - ภายใน n - -

กลับ n - 1 - 1 - - n - แฟกทอเรียล - n - 1 - - -

-

ภายใน หลัก - - -

ภายใน หนึ่ง - 5 -

มาตรฐาน - ศาล - 'แฟกทอเรียลของ' - หนึ่ง - - - แฟกทอเรียล - หนึ่ง - - มาตรฐาน - สิ้นสุด -

-

ตัวอย่างโค้ดที่กำหนดแสดงให้เห็นถึงการใช้ constexpr ในการคำนวณแฟกทอเรียลของตัวเลขในลักษณะวนซ้ำ คอมไพลเลอร์สามารถประเมินนิพจน์แฟกทอเรียลในเวลาคอมไพล์ในตัวอย่างนี้ เนื่องจากมีการประกาศและกำหนดฟังก์ชันแฟกทอเรียลด้วยตัวระบุ constexpr การใช้ constexpr ในโปรแกรม C++ คอมไพลเลอร์จะประเมินนิพจน์แฟกทอเรียลที่ 5 ในเวลาคอมไพล์ ซึ่งช่วยลดความจำเป็นในการคำนวณรันไทม์



ตอนนี้ให้เราดูรายละเอียดรายละเอียดของโค้ดพร้อมรายละเอียดและคำอธิบายเฉพาะ



ขั้นแรก เราใช้ #include เพื่อรวมไฟล์ส่วนหัว 'iostream' ซึ่งมีฟังก์ชันอินพุตและเอาต์พุตที่จำเป็น เช่น 'std::cout' สำหรับการพิมพ์ไปยังคอนโซล





หลังจากนั้น เราจะย้ายไปยังฟังก์ชัน 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 ถูกรวมไว้เพื่อใช้ไลบรารีสตรีมอินพุต/เอาท์พุตมาตรฐานเพื่อพิมพ์ข้อความ #include รวมคลาส 'string_view' เพื่อการจัดการสตริงที่มีประสิทธิภาพ

ในฟังก์ชัน 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 โปรแกรมเริ่มดำเนินการจากฟังก์ชัน int main() ภายในฟังก์ชัน main() อาร์เรย์ “arrayint[]” ถูกกำหนดไว้ โดยมีขนาด 9 พร้อมด้วยคำสั่ง constexpr int arrayint[9] อาร์เรย์เริ่มต้นด้วยตัวเลขห้าตัว และองค์ประกอบที่เหลือยังคงเป็น 0 โดยปริยาย int length_a = sizeof arrayint / sizeof(int); คำนวณขนาดของ 'อาร์เรย์' เป็นไบต์

ลูป “for” จะวนซ้ำผ่านองค์ประกอบของอาร์เรย์ “arrayint[]” จากนั้นค่าต่างๆ จะถูกพิมพ์ลงบนคอนโซล ให้เราดูผลลัพธ์ต่อไปนี้ของโค้ดที่กำหนด:

บทสรุป

การแนะนำและวิวัฒนาการของคีย์เวิร์ด constexpr ใน C++ ได้ปฏิวัติวิธีการจัดการนิพจน์และค่าคงที่ บทความนี้สำรวจตัวอย่างเชิงปฏิบัติสามตัวอย่าง โดยแสดงพลังของ constexpr ในการคำนวณแฟกทอเรียล การนับตัวอักษรตัวพิมพ์เล็ก และการเริ่มต้นอาร์เรย์ในเวลาคอมไพล์ ประเด็นสำคัญ ได้แก่ ประสิทธิภาพที่เพิ่มขึ้น การคำนวณรันไทม์ที่ลดลง และประสิทธิภาพของหน่วยความจำที่ดีขึ้น Constexpr เป็นทรัพย์สินที่มีค่าสำหรับการสร้างเอนทิตีที่เชื่อถือได้และคงที่ภายในโค้ดเบส ช่วยให้มั่นใจถึงความไม่เปลี่ยนแปลง และมีส่วนทำให้โปรแกรมมีความคล่องตัวและมีประสิทธิภาพมากขึ้น