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]]
示例
[[noreturn]] void f();
此函式不會返回值,甚至不返回 void。
在 C++ 中使用 noreturn 屬性時,如果發生錯誤並且流程沒有返回到呼叫程式碼(例如,無限迴圈或任何錯誤),則會使編譯器能夠返回警告。
carries_dependency - 用於定義所有釋出-消費依賴項,並允許編譯器透過不執行不必要的記憶體消耗指令來進行最佳化。
語法
[[carries_dependency]]
主要用於函式或引數的宣告中,以宣告依賴關係。
deprecated - 用於定義程式碼中已棄用的實體。允許使用此已棄用的實體,但不建議使用。
語法
[[deprecated]] [[deprecated (reason)]]
原因是一個字串,說明棄用的原因,併為已棄用的實體提供替代方案。
可以棄用的實體包括類、結構體、聯合體、typedef-name、靜態成員、函式、名稱空間、列舉。
fallthrough - 用於指示編譯器從下一個 case 的貫穿是故意的,因此編譯器不會警告貫穿。
語法
[[fallthrough]]
fallthrough 只能與 switch 一起使用,因為它的下一個 case 已定義。
nodiscard - 用於一個函式,該函式將返回一個列舉,該列舉將從丟棄的值表示式而不是強制轉換為 void 呼叫中呼叫。編譯器也將為此發出警告。
語法
[[nodiscard]] [[nodiscard (reason)]] (added in C++ 20)
原因是一個字串,用於提供不丟棄結果的原因,這將在 C++ 20 中包含。
maybe_unused - 用於告訴編譯器抑制或消除在未使用實體的情況下顯示的警告。
語法
[[maybe_unused]]
可以宣告為 maybe_unused 的實體包括類、結構體、聯合體、typedef-name、靜態成員、函式、變數、列舉。
likely, unlikely - 用於定義備用路徑是否比當前執行更可能或不太可能。
語法
[[likely]] [[unlikely]]
通常應用於更改程式流程的實體,例如標籤和語句。
no_unique_address - 用於定義不需要特定地址的資料成員。通常用於非靜態資料成員的情況下,定義其記憶體分配不是必需的。
語法
[[no_unique_address]]
當編譯器需要在普通變數和 no_unique_address 變數之間分配記憶體位置時,這很有用,編譯器將優先考慮前者。
Optimize_for_synchronized - 用於定義給定函式的定義必須針對從同步語句呼叫進行最佳化。
語法
[[optimize_for_synchronized]]
定義為 optimize_for_synchronized 的函式將避免序列化同步塊。
expects - 指定函式執行的函式引數必須滿足的條件。
語法
[[expects : condition]]
條件定義了函式執行必須滿足的條件。
這些都是從 C++ 11 到 C++ 20 在 C++ 中定義的所有屬性。現在,讓我們看看為什麼這些屬性在程式設計中使用,即建議的屬性解決了什麼問題?
向程式碼新增約束 - 在許多情況下,屬性會向程式碼新增含義,使其更有效,並減少額外的精力。
向編譯器提供更多最佳化資訊 - 一些屬性(如 fallthrough、likely、maybe_used)向編譯器提供資訊,以便執行特定的最佳化。
避免警告和錯誤 - 有時,程式設計師的邏輯違反了 C++ 的嚴格規則。在這種情況下,一些屬性可以發揮作用,幫助使用者避免或抑制即將發生的警告。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP