Home Item 30 - likely 和 unlikely 屬性(中文)
Post
Cancel

Item 30 - likely 和 unlikely 屬性(中文)

c++ 屬性

在 code 中,偶爾會看到 [[nodiscard]]..加在神奇的地方, 這些語法稱為屬性,屬性要幹嘛用的?

屬性 C++ 中的一種語法,用於向編譯器提供額外的信息,這些信息可以影響程序的編譯或執行方式。這些屬性可以應用於各種程式元素,如類、結構體、函數、變量等。

常見的屬性

[[nodiscard]]: 標記一個函數的返回值不應該被忽略。 [[deprecated]]: 標記一個元素為過時,使用時會給出警告。 [[maybe_unused]]: 標記一個變量或參數可能未使用,以防止編譯器給出未使用變量的警告。

看個簡單的例子吧

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

[[nodiscard]]
int calculate() {
    return 81;
}

int main() {
    calculate(); // 這裡會產生一個編譯警告,因為返回值被忽略
    return 0;
}

結果

Desktop View

[[likely]] 和 [[unlikely]]

C++20 引入了 [[likely]][[unlikely]] 屬性,這些屬性用來告訴編譯器某個分支在執行時更有可能或不太可能被選中,從而幫助編譯器進行更好的優化。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

int main() {
    int x = 10;

    if (x > 0) [[likely]] {
        std::cout << "x is positive\n";
    } else [[unlikely]] {
        std::cout << "x is non-positive\n";
    }

    return 0;
}

解釋: [[likely]]: 標記這個分支更有可能被執行。在上面的例子中,如果 x > 0 的情況更常見,編譯器會優化這個分支以提高性能。 [[unlikely]]: 標記這個分支不太可能被執行。在上面的例子中,如果 x <= 0 的情況較少發生,編譯器會針對這種情況進行不同的優化。

使用時機

這些屬性特別適合用在分支預測對性能有較大影響的地方

  1. 高性能的數據處理。
  2. 網絡或 I/O 操作的錯誤處理。
  3. 常見情況和罕見情況有明顯區別的算法。

注意! 使用這些屬性僅僅是提示,編譯器可以選擇忽略它們。 這些屬性不改變程序的語義,只是用於優化。

☝ツ☝

This post is licensed under CC BY 4.0 by the author.

👈 ツ 👍

Item 30 - likely and unlikely Attributes(English)

Item 26 - Range-based for Loop Enhancements(English)