Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

แอตทริบิวต์ใน C++


คุณลักษณะเป็นวิธีที่ทันสมัยใน C ++ เพื่อสร้างมาตรฐานให้กับสิ่งต่าง ๆ หากรหัสทำงานบนคอมไพเลอร์ที่แตกต่างกัน แอตทริบิวต์จะใช้เพื่อให้ข้อมูลเพิ่มเติมบางอย่างที่ใช้ในการบังคับใช้เงื่อนไข (ข้อจำกัด) การเพิ่มประสิทธิภาพ และสร้างโค้ดเฉพาะหากจำเป็น

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

มาดูกันว่าเราจะกำหนดแอตทริบิวต์ใน C++ ได้อย่างไร

สำหรับ C++ เวอร์ชันต่างๆ ไวยากรณ์สำหรับการกำหนดแอตทริบิวต์จะต่างกัน

ไวยากรณ์สำหรับการสร้างแอตทริบิวต์ใน c++ 11 -

[[attribute-list]]

ไวยากรณ์สำหรับการสร้างแอตทริบิวต์ใน c++ 17 -

[[using attribute-namespace : attribute_list]]

ไวยากรณ์สำหรับการสร้างแอตทริบิวต์ใน c++ 20 (จะเผยแพร่เร็วๆ นี้) -

[[contract-attriubute-token contract-level-identifier : expression]]

คุณสามารถใช้แอตทริบิวต์ต่างๆ กับตัวแปร ฟังก์ชัน คลาสได้

ตอนนี้ เนื่องจากเรารู้ว่าคุณลักษณะคืออะไร มีการทำงานอย่างไร และมีการกำหนดไว้อย่างไร มาดูคุณสมบัติมาตรฐานต่างๆ ที่มีอยู่ใน c++ กัน

คุณลักษณะที่แนะนำใน C++ 11

นอร์เทิร์น − คุณลักษณะนี้ใช้เพื่อบอกคอมไพเลอร์ว่าฟังก์ชันไม่คืนค่าใดๆ

ไวยากรณ์

[[noreturn]]

ตัวอย่าง

[[noreturn]] void f();

ฟังก์ชันนี้จะไม่คืนค่าใดๆ แม้แต่ค่าที่เป็นโมฆะ

เมื่อใช้ใน c++ แอตทริบิวต์ noreturn ช่วยให้คอมไพเลอร์สามารถส่งคืนคำเตือนในกรณีที่มีสิ่งผิดปกติเกิดขึ้นและโฟลว์ไม่กลับไปที่โค้ดการเรียก เช่น ในกรณีของการวนซ้ำที่ไม่มีที่สิ้นสุดหรือข้อผิดพลาดใดๆ

carries_dependency − สิ่งนี้ใช้เพื่อกำหนดการอ้างอิงทั้งหมดที่อยู่ใน release-consume และอนุญาตให้คอมไพเลอร์ปรับให้เหมาะสมโดยไม่ทำตามคำแนะนำการใช้หน่วยความจำที่ไม่จำเป็น

ไวยากรณ์

[[carries_dependency]]

ส่วนใหญ่จะใช้กับการประกาศฟังก์ชันหรือพารามิเตอร์เพื่อประกาศการพึ่งพา

เลิกใช้แล้ว − ใช้เพื่อกำหนดเอนทิตีที่เลิกใช้แล้วในโค้ด อนุญาตให้ใช้เอนทิตีที่เลิกใช้งานแล้ว แต่ไม่แนะนำให้ใช้

ไวยากรณ์

[[deprecated]]
[[deprecated (reason)]]

เหตุผลคือสตริงที่ให้เหตุผลว่าทำไมการคิดค่าเสื่อมราคาจึงเสร็จสิ้น และยังให้ทางเลือกสำหรับเอนทิตีที่เลิกใช้แล้วด้วย

เอนทิตีที่สามารถเลิกใช้ได้ ได้แก่ คลาส โครงสร้าง ยูเนี่ยน ชื่อ typedef สมาชิกแบบคงที่ ฟังก์ชัน เนมสเปซ การแจงนับ

ล้มลง − ใช้เพื่อระบุให้คอมไพเลอร์ทราบว่า fallthrough จากกรณีถัดไปเป็นเจตนา เนื่องจากคอมไพเลอร์ไม่เตือน fallthrough

ไวยากรณ์

[[fallthrough]]

Fallthrough สามารถใช้กับสวิตช์ได้เฉพาะในกรณีถัดไปเท่านั้น

nodiscard − สิ่งนี้ใช้สำหรับฟังก์ชันที่จะส่งคืนการแจงนับจะถูกเรียกจากนิพจน์ค่าที่ถูกละทิ้ง แทนที่จะส่งไปยังการเรียกเป็นโมฆะ คอมไพเลอร์จะออกคำเตือนสำหรับมันด้วย

ไวยากรณ์

[[nodiscard]]
[[nodiscard (reason)]] (added in C++ 20)

เหตุผลคือสตริงที่ใช้เพื่อให้เหตุผลที่ไม่ทิ้งผลลัพธ์ และจะรวมอยู่ใน c++ 20

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

ไวยากรณ์

[[maybe_unused]]

เอนทิตีที่สามารถประกาศได้ may_unused ได้แก่ class, โครงสร้าง, union, typedef-name, สมาชิกแบบสแตติก, ฟังก์ชัน, ตัวแปร, การแจงนับ

มีแนวโน้ม ไม่น่าเป็นไปได้ − สิ่งเหล่านี้ใช้เพื่อกำหนดสภาพอากาศสำหรับเส้นทางทางเลือกที่มีแนวโน้มมากหรือน้อยที่การดำเนินการในปัจจุบัน

ไวยากรณ์

[[likely]]
[[unlikely]]

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

no_unique_address − ใช้เพื่อกำหนดสมาชิกข้อมูลที่ไม่ต้องมีที่อยู่เฉพาะ โดยทั่วไปจะใช้ในกรณีที่สมาชิกข้อมูลที่ไม่คงที่ซึ่งกำหนดการจัดสรรหน่วยความจำไม่จำเป็น

ไวยากรณ์

[[no_unique_address]]

สิ่งนี้มีประโยชน์เมื่อคอมไพเลอร์จำเป็นต้องกำหนดตำแหน่งหน่วยความจำระหว่างตัวแปรปกติและตัวแปร no_unique_address คอมไพเลอร์จะจัดลำดับความสำคัญของตัวแปรก่อนหน้า

Optimize_for_synchronized − ใช้เพื่อกำหนดว่านิยามของฟังก์ชันที่กำหนดจะต้องมีการปรับให้เหมาะสมสำหรับการเรียกใช้จากคำสั่งที่ซิงโครไนซ์

ไวยากรณ์

[[optimize_for_synchronized]]

ฟังก์ชันที่กำหนดเป็นOptimize_for_synchronized จะหลีกเลี่ยงการทำให้บล็อกที่ซิงโครไนซ์เป็นอนุกรม

คาดหวัง − ระบุเงื่อนไขที่จำเป็นสำหรับอาร์กิวเมนต์ของฟังก์ชันสำหรับฟังก์ชันที่จะดำเนินการ

ไวยากรณ์

[[expects : condition]]

เงื่อนไข กำหนดเงื่อนไขที่จะต้องปฏิบัติตามสำหรับฟังก์ชันที่จะดำเนินการ

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

  • การเพิ่มข้อจำกัดให้กับโค้ด − ในหลายกรณี คุณลักษณะเพิ่มความหมายให้กับโค้ดและทำให้ถูกต้องยิ่งขึ้น และลดความพยายามพิเศษลง

  • ให้ข้อมูลการเพิ่มประสิทธิภาพเพิ่มเติมแก่คอมไพเลอร์ − คุณลักษณะบางอย่างเช่น fallthrough, มีแนวโน้ม, อาจบางที_used ให้ข้อมูลแก่คอมไพเลอร์เพื่อทำการเพิ่มประสิทธิภาพเฉพาะ

  • หนีคำเตือนและข้อผิดพลาด − บางครั้งตรรกะของโปรแกรมเมอร์ขัดกับกฎเกณฑ์ที่เข้มงวดของ C++ นี่เป็นกรณีที่คุณลักษณะบางอย่างเข้ามาเล่นและช่วยให้ผู้ใช้หลีกเลี่ยงหรือระงับคำเตือนที่จะเกิดขึ้น