国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【ARM 嵌入式 編譯系列 4.1 -- GCC 編譯屬性 likely與unlikely 學(xué)習(xí)】

這篇具有很好參考價(jià)值的文章主要介紹了【ARM 嵌入式 編譯系列 4.1 -- GCC 編譯屬性 likely與unlikely 學(xué)習(xí)】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


請(qǐng)閱讀【ARM GCC 編譯專欄導(dǎo)讀】


上篇文章:ARM 嵌入式 編譯系列 4 – GCC 編譯屬性 __read_mostly 介紹
下篇文章: ARM 嵌入式 編譯系列 4.2 – GCC 鏈接規(guī)范 extern “C“ 介紹

GCC likely與unlikely 介紹

likelyunlikely 是GCC編譯器提供的一種代碼優(yōu)化特性,這兩個(gè)宏用于告訴編譯器某個(gè)條件判斷的結(jié)果是真還是假的可能性更大。

在編寫(xiě)代碼時(shí),如果我們已經(jīng)知道某個(gè)條件判斷的結(jié)果大部分情況下都是真或者假,就可以使用likelyunlikely宏來(lái)進(jìn)行標(biāo)記,編譯器會(huì)根據(jù)這個(gè)提示進(jìn)行優(yōu)化,使得代碼運(yùn)行更高效。

以下是這兩個(gè)宏的定義:

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

這里的__builtin_expectGCC的內(nèi)建函數(shù),用于提供編譯器關(guān)于表達(dá)式結(jié)果的預(yù)期值。

以下是如何在代碼中使用這兩個(gè)宏的:

if (likely(x > 0)) {
	// 大部分情況下,x都大于0 
} else { 
  // 一般情況下,這里的代碼不會(huì)執(zhí)行 
} 

if (unlikely(err != 0)) {
 // 一般情況下,err都等于0,所以這里的代碼很少執(zhí)行 
}

在這兩個(gè)示例中,likelyunlikely宏標(biāo)記了條件判斷的結(jié)果預(yù)期,這樣編譯器在生成機(jī)器代碼時(shí),可以將更可能執(zhí)行的代碼放在內(nèi)存中的靠前位置,從而提高代碼執(zhí)行效率。

linux 內(nèi)核中的 likely/unlikely

這兩個(gè)宏在內(nèi)核中的定義如下:

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

可見(jiàn)這里使用了 gcc 的內(nèi)建函數(shù) __builtin_expect()。

__builtin_expect (long exp, long c) 函數(shù):
該函數(shù)用來(lái)引導(dǎo) gcc 進(jìn)行條件分支預(yù)測(cè)。在一條指令執(zhí)行時(shí),由于流水線的作用,CPU可以同時(shí)完成下一條指令的取指,這樣可以提高CPU的利用率。在執(zhí)行條件分支指令時(shí),CPU也會(huì)預(yù)取下一條執(zhí)行,但是如果條件分支的結(jié)果為跳轉(zhuǎn)到了其他指令,那 CPU 預(yù)取的下一條指令就沒(méi)用了,這樣就降低了流水線的效率。
另外,跳轉(zhuǎn)指令相對(duì)于順序執(zhí)行的指令會(huì)多消耗 CPU 時(shí)間,如果可以盡可能不執(zhí)行跳轉(zhuǎn),也可以提高 CPU 性能。

使用 __builtin_expect (long exp, long c) 函數(shù)可以幫助 gcc 優(yōu)化程序編譯后的指令序列,使匯編指令盡可能的順序執(zhí)行,從而提高 CPU 預(yù)取指令的正確率和執(zhí)行效率。

__builtin_expect(exp, c) 接受兩個(gè) long 型的參數(shù),用來(lái)告訴 gcc:exp==c 的可能性比較大。
例如,__builtin_expect(exp, 1) 表示程序執(zhí)行過(guò)程中,exp 取到 1 的可能性比較大。該函數(shù)的返回值為 exp 自身。

內(nèi)核中 likely(x)unlikely(x)
知道 __builtin_expect() 函數(shù)的作用之后,我們就知道內(nèi)核中 likely(x)unlikely(x) 宏的作用了,通過(guò) likely(x)unlikely(x) 宏定義,我們可以得出他們的作用:

  • likely(x) 等價(jià)于 x,即 if (likely(x)) 等價(jià)于 if (x),但是它告訴 gcc,x 取 1 的可能性比較大;
  • unlikely(x) 等價(jià)于 x,即 if (unlikely(x))等 價(jià)于 if (x),但是它告訴 gcc,x 取 0 的可能性比較大。

上篇文章:ARM 嵌入式 編譯系列 4 – GCC 編譯屬性 __read_mostly 介紹
下篇文章: ARM 嵌入式 編譯系列 4.2 – GCC 鏈接規(guī)范 extern “C“ 介紹
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655837.html

到了這里,關(guān)于【ARM 嵌入式 編譯系列 4.1 -- GCC 編譯屬性 likely與unlikely 學(xué)習(xí)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【ARM 嵌入式 編譯系列 5 -- GCC 內(nèi)建函數(shù) __builtin 介紹】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 4.2 – GCC 鏈接規(guī)范 extern “C“ 介紹 下篇文章:ARM 嵌入式 編譯系列 6 – GCC objcopy, objdump, readelf, nm 介紹 GCC提供了一些專門的功能,用于訪問(wèn)特定的硬件指令或者實(shí)現(xiàn)特定的優(yōu)化,它們被稱為\\\" __builtin \\\"函數(shù)。 這些

    2024年02月13日
    瀏覽(96)
  • 【ARM 嵌入式 編譯系列 4.2 -- GCC 鏈接規(guī)范 extern “C“ 介紹】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 4.1 – GCC 編譯屬性 likely與unlikely 學(xué)習(xí) 下篇文章:ARM 嵌入式 編譯系列 5 – GCC 內(nèi)建函數(shù) __builtin 介紹 extern “C” 是一種鏈接規(guī)范,它用于告訴C++編譯器按照C語(yǔ)言的方式來(lái)鏈接代碼。這個(gè)主要用于在C++代碼

    2024年02月13日
    瀏覽(54)
  • 【ARM 嵌入式 編譯系列 7.3 -- GCC 鏈接腳本中 DISCARD 與 .ARM.exidx】

    【ARM 嵌入式 編譯系列 7.3 -- GCC 鏈接腳本中 DISCARD 與 .ARM.exidx】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專欄 之 ARM GCC 編譯專欄】 在移植 RT-Thread 到 cortex-m33(RA4M2)上的時(shí)候,在編譯的時(shí)候遇到下面問(wèn)題:

    2024年01月23日
    瀏覽(73)
  • 【ARM 嵌入式 編譯系列 2.5 -- GCC 編譯參數(shù)學(xué)習(xí) --specs=nano.specs選項(xiàng) 】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專欄 之 ARM GCC 編譯專欄】 ARM 工具鏈 ( arm-none-eabi- ) 包括了一個(gè)叫作 --specs 的編譯器和鏈接器選項(xiàng),這個(gè)選項(xiàng)允許用戶指定一個(gè)或多個(gè) “specs” 文件,以影響編譯或鏈接階段的行為。Specs 文件包含一系列的命令行參數(shù),這些參數(shù)可以是編譯器選項(xiàng)

    2024年01月22日
    瀏覽(28)
  • 【ARM 嵌入式 編譯系列 5 -- GCC 內(nèi)建函數(shù) __builtin 詳細(xì)介紹】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 4.2 – GCC 鏈接規(guī)范 extern “C“ 介紹 下篇文章:ARM 嵌入式 編譯系列 6 – GCC objcopy, objdump, readelf, nm 介紹 GCC提供了一些專門的功能,用于訪問(wèn)特定的硬件指令或者實(shí)現(xiàn)特定的優(yōu)化,它們被稱為\\\" __builtin \\\"函數(shù)。 這些

    2024年02月13日
    瀏覽(116)
  • 【ARM 嵌入式 編譯系列 6 -- GCC objcopy, objdump, readelf, nm 介紹】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 5 – GCC 內(nèi)建函數(shù) __builtin 詳細(xì)介紹 下篇文章:ARM 嵌入式 編譯系列 7 – ARM GCC 鏈接腳本詳細(xì)講解 objcopy 是 GNU二進(jìn)制工具集(binutils)的一部分,主要用于復(fù)制和轉(zhuǎn)換目標(biāo)文件。 在ARM GCC中, arm-none-eabi-objcopy 通常用于

    2024年02月13日
    瀏覽(79)
  • 【ARM 嵌入式 編譯系列 2.4 -- GCC 編譯參數(shù)學(xué)習(xí) -Wl,--gc-sections 】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專欄 之 ARM GCC 編譯專欄】 在使用 GCC (GNU Compiler Collection) 進(jìn)行編譯時(shí),可以通過(guò)不同的編譯參數(shù)(標(biāo)志)來(lái)控制編譯行為、優(yōu)化級(jí)別、警告輸出等。以下是您列出的一些 GCC 編譯參數(shù)的介紹: 參數(shù) 作用 –all-warnings 與-Wall 相同。 請(qǐng)改用后一個(gè)選

    2024年01月22日
    瀏覽(20)
  • 【ARM 嵌入式 編譯系列 11 -- GCC __attribute__((packed))詳細(xì)介紹】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 10.3 – GNU elfutils 工具小結(jié) 下篇文章:ARM 嵌入式 編譯系列 11.1 – GCC attribute ((aligned(x)))詳細(xì)介紹 __attribute__((packed)) 是 GCC 編譯器的一個(gè)特性,它可以用于阻止編譯器為結(jié)構(gòu)體或聯(lián)合體的成員進(jìn)行對(duì)齊優(yōu)化,從而使

    2024年02月12日
    瀏覽(80)
  • 【ARM 嵌入式 編譯系列 3.1 -- GCC __attribute__((used)) 使用】

    請(qǐng)閱讀 【ARM GCC 編譯專欄導(dǎo)讀】 上篇文章:ARM 嵌入式 編譯系列 3 – GCC attribute ((weak)) 弱符號(hào)使用 下篇文章:ARM 嵌入式 編譯系列 3.2 – glibc 學(xué)習(xí) 在普通的 C/C++ 程序中,有的時(shí)候?yàn)榱苏{(diào)試,我們會(huì)特別地注釋掉某個(gè)函數(shù)的調(diào)用。然而在編譯時(shí),編譯器會(huì)發(fā)現(xiàn),代碼中實(shí)現(xiàn)了

    2024年02月12日
    瀏覽(42)
  • 【ARM 嵌入式 編譯系列 2.6 -- GCC 編譯時(shí)間統(tǒng)計(jì)參數(shù) -ftime-report -Q 】

    請(qǐng)閱讀 【嵌入式開(kāi)發(fā)學(xué)習(xí)必備專欄 之 ARM GCC 編譯專欄】 如果你想要統(tǒng)計(jì) GCC 編譯過(guò)程中各個(gè)階段的時(shí)間,可以使用 GCC 的 -ftime-report 選項(xiàng)。這個(gè)選項(xiàng)可以讓編譯器在編譯結(jié)束后報(bào)告每個(gè)編譯階段所花費(fèi)的時(shí)間。要使用這個(gè)選項(xiàng),你可以在編譯命令中加入它,如下所示: 這將

    2024年01月21日
    瀏覽(43)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包