最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++關(guān)鍵字之likely和unlikely詳解

 更新時間:2022年10月15日 11:50:13   作者:misaka-mikoto  
這篇文章主要介紹了C++關(guān)鍵字之likely和unlikely,C++20之前的,likely和unlikely只不過是一對自定義的宏,而C++20中正式將likely和unlikely確定為屬性關(guān)鍵字,本文給大家詳細講解,需要的朋友可以參考下

什么是likely和unlikely

既然程序是我們程序員所寫,在一些明確的場景下,我們應該比CPU和編譯器更了解哪個分支條件更有可能被滿足。我們是否可將這一先驗知識告知編譯器和CPU, 提高分支預測的準確率,從而減少CPU流水線分支預測錯誤帶來的性能損失呢?答案是可以!它便是likely和unlikely。在Linux內(nèi)核代碼中,這兩個宏的應用比比皆是。下面是他們的定義:

#define likely(x) __builtin_expect(!!(x), 1) 
#define unlikely(x) __builtin_expect(!!(x), 0)

likely,用于修飾if/else if分支,表示該分支的條件更有可能被滿足。而unlikely與之相反
以下為示例。unlikely修飾argc > 0分支,表示該分支不太可能被滿足。

#include <cstdio>

#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)

int main(int argc, char *argv[])
{
    if (unlikely(argc > 0)) {
        puts ("Positive\n");
    } else
    {
        puts ("Zero or Negative\n");
    }
    return 0;
}

likely/unlikely的原理

接下來,我們從匯編指令分析likely/unlikely到底是如何起作用的?
首先我們將上述代碼中的unlikely去掉,然后反匯編,作為對照組
匯編如下,我們看到,if分支中的指令被編譯器放置于分支跳轉(zhuǎn)指令jle相鄰的位置,即CPU流水線在遇到j(luò)le指令所代表的的'岔路口'時,更傾向于走if分支

.LC0:
        .string "Positive\n"
.LC1:
        .string "Zero or Negative\n"
main:
        sub     rsp, 8
        test    edi, edi                
        jle     .L2                     ; 如果argc <= 0, 跳轉(zhuǎn)到L2
        mov     edi, OFFSET FLAT:.LC0   ; 如果argc > 0, 從這里執(zhí)行
        call    puts
.L3:
        xor     eax, eax
        add     rsp, 8
        ret
.L2:
        mov     edi, OFFSET FLAT:.LC1
        call    puts
        jmp     .L3

接著我們在if分支中加上unlikely, 反匯編如下。這里的情況正好與對照組相反,if分支下的指令被編譯器放置于遠離跳轉(zhuǎn)指令jg的位置。這意味著CPU此時更傾向于走else分支。

.LC0:
        .string "Positive\n"
.LC1:
        .string "Zero or Negative\n"
main:
        sub     rsp, 8
        test    edi, edi
        jg      .L6
        mov     edi, OFFSET FLAT:.LC1
        call    puts
.L3:
        xor     eax, eax
        add     rsp, 8
        ret
.L6:
        mov     edi, OFFSET FLAT:.LC0
        call    puts
        jmp     .L3

因此,通過對分支條件使用likely和unlikely,我們可給編譯器一種暗示,即該分支條件被滿足的概率比較大或比較小。而編譯器利用這一信息優(yōu)化其機器指令,從而最大限度減少CPU分支預測失敗帶來的懲罰。

likely/unlikely的適用條件

CPU有自帶的分支預測器,在大多數(shù)場景下效果不錯。因此在分支發(fā)生概率嚴重傾斜、追求極致性能的場景下,使用likely/unlikely才具有較大意義。

C++20中的likely/unlikely

C++20之前的,likely和unlikely只不過是一對自定義的宏。而C++20中正式將likely和unlikely確定為屬性關(guān)鍵字。

int foo(int i) {
    switch(i) {
               case 1: handle1();
                       break;
    [[likely]] case 2: handle2();
                       break;
    }
}

到此這篇關(guān)于C++關(guān)鍵字之likely和unlikely詳解的文章就介紹到這了,更多相關(guān)C++ likely和unlikely內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++統(tǒng)計文件中字符個數(shù)代碼匯總

    c++統(tǒng)計文件中字符個數(shù)代碼匯總

    本文給大家匯總介紹了3種使用C++實現(xiàn)統(tǒng)計文件中的字符個數(shù)的方法,非常的簡單實用,有需要的小伙伴可以參考下。
    2015-09-09
  • 基于C++中常見編譯錯誤的總結(jié)詳解

    基于C++中常見編譯錯誤的總結(jié)詳解

    本篇文章是對C++中的常見編譯錯誤進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 程序員都不知道C語言中的這些小細節(jié)

    程序員都不知道C語言中的這些小細節(jié)

    本文通過7到實例題目給大家展示C語言中的一些小細節(jié),很少有朋友真正的掌握,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • C++實現(xiàn)LeetCode(133.克隆無向圖)

    C++實現(xiàn)LeetCode(133.克隆無向圖)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(133.克隆無向圖),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++?NFS掛載及掛載命令

    C++?NFS掛載及掛載命令

    這篇文章主要介紹了C++?NFS掛載,文中給大家提到了掛載NFS時常用的命令,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C++?多態(tài)虛函數(shù)的底層原理深入理解

    C++?多態(tài)虛函數(shù)的底層原理深入理解

    這篇文章主要介紹了C++?多態(tài)虛函數(shù)的底層原理深入理解,多態(tài)是在不同繼承關(guān)系的類對象,去調(diào)用同一函數(shù),產(chǎn)生了不同的行為,通常是父類調(diào)用子類的重寫函數(shù),在C++中就是?父類指針指向子類對象,此時父類指針的向下引用就可以實現(xiàn)多態(tài)
    2022-08-08
  • C++中strstr函數(shù)的實現(xiàn)方法總結(jié)

    C++中strstr函數(shù)的實現(xiàn)方法總結(jié)

    這篇文章主要介紹了C++中strstr函數(shù)的實現(xiàn)方法總結(jié)的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C語言學習之標識符的使用詳解

    C語言學習之標識符的使用詳解

    C語言標識符是用于表示變量、函數(shù)、常量、類型等程序元素的名稱,這篇文章將通過一些簡單的示例為大家介紹一下C語言標識符的使用,需要的可以參考一下
    2023-05-05
  • C++之Qt5雙緩沖機制案例教程

    C++之Qt5雙緩沖機制案例教程

    這篇文章主要介紹了C++之Qt5雙緩沖機制案例教程,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++實現(xiàn)LeetCode(35.搜索插入位置)

    C++實現(xiàn)LeetCode(35.搜索插入位置)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(35.搜索插入位置),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

互助| 兴城市| 临沧市| 郯城县| 茌平县| 紫云| 泰兴市| 梅州市| 南开区| 鄂伦春自治旗| 广昌县| 禹城市| 石门县| 威远县| 桃源县| 垫江县| 盐亭县| 颍上县| 恭城| 金平| 花莲市| 乌什县| 星座| 汉中市| 盈江县| 田林县| 双峰县| 江山市| 花莲县| 民县| 山丹县| 汕尾市| 都安| 福清市| 大方县| 社会| 城固县| 迁安市| 泸州市| 调兵山市| 广安市|