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++ 的嚴格規則。在這種情況下,一些屬性可以發揮作用,幫助使用者避免或抑制即將發生的警告。

更新於: 2020年7月17日

3K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.