成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些-創(chuàng)新互聯(lián)

小編給大家分享一下Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

目前創(chuàng)新互聯(lián)公司已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管運(yùn)營、企業(yè)網(wǎng)站設(shè)計(jì)、蔡甸網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

01、編譯選項(xiàng)和內(nèi)核編譯

Linux內(nèi)核(英語:linux kernel),是一種計(jì)算機(jī)操作系統(tǒng)內(nèi)核,已C語言和匯編語言寫成,匹配POSIX標(biāo)準(zhǔn),以GNU通用公共許可證發(fā)布。從技術(shù)上說Linux只是一個(gè)內(nèi)核?!皟?nèi)核”指的是一個(gè)提供硬件抽象層、磁盤及文件控制、多任務(wù)等功能的系統(tǒng)軟件。

所以首先我們都知道,Linux內(nèi)核如果用O0編譯,是無法編譯過的,Linux的內(nèi)核編譯,要么是O2,要么是Os,這點(diǎn)從Linux的Makefile里面可以看出:

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

當(dāng)選擇了

CONFIG_CC_OPTIMIZE_FOR_SIZE

它會(huì)是Os,否則就是O2。

其實(shí)O2和Os,都是一些優(yōu)化選項(xiàng)的集合:

gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts

gcc -c -Q -Os --help=optimizers > /tmp/Os-opts

前者傾向于基于速度的優(yōu)化,后者傾向于基于size更小的優(yōu)化。對(duì)比二者的開關(guān)選項(xiàng):

meld /tmp/O2-opts /tmp/Os-opts

發(fā)現(xiàn)差異小的可憐:

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

O2和Os都使能了inline small函數(shù)和called once的函數(shù),但是O2里面-finline-functions是關(guān)閉的,而Os里面是開的。O2里面optimize-strlen是開的,Os里面這個(gè)選項(xiàng)是關(guān)閉的。相關(guān)選項(xiàng)的含義可以通過"man gcc"看出(有問題,找男人),譬如man gcc后檢索inline-functions:

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

從O0到O1,O2,O3,是一個(gè)開啟的優(yōu)化選項(xiàng)逐步加大的過程:

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

kernel用O0編譯不過,是因?yàn)閗ernel本身也沒有想用O0能夠編譯過,它的設(shè)計(jì)里面包含了編譯會(huì)優(yōu)化的假想。下面我們用一個(gè)簡單的例子來說明。

02、一個(gè)簡單的例子

下面的代碼:

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

O0編譯會(huì)報(bào)如下錯(cuò),說f()函數(shù)沒有定義:

$ gcc -O0 cc.c

cc.c:1:13: warning: ‘f' used but never defined [enabled by default]

 void f(void);

    ^

/tmp/ccTwwtHG.o: In function `main':

cc.c:(.text+0x19): undefined reference to `f'

collect2: error: ld returned 1 exit status

但是用O2編譯,則沒有問題:

$ gcc -O2 cc.c

原因在于,O2編譯,它意識(shí)到a==1,所以if(a>2),它不會(huì)成立,所以f()沒有定義也沒有關(guān)系。

把代碼稍微改一下后:

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

O2這個(gè)時(shí)候也不行了:

$ gcc -O2 cc.c

/tmp/ccXiyBHn.o: In function `main':

cc.c:(.text.startup+0x7): undefined reference to `f'

collect2: error: ld returned 1 exit status

所以,通過這個(gè)例子,大家可以看出來為什么同樣的代碼,用O2就可以過,用O0就過不了。內(nèi)核里面有許多類似設(shè)想編譯器會(huì)進(jìn)行優(yōu)化的代碼。

3.我們不想inline了

由于編譯的優(yōu)化,有些函數(shù)(比如小函數(shù)和全工程里面只被一個(gè)人調(diào)用的函數(shù))雖然沒有顯示地寫成inline,但是編譯器優(yōu)化為inline了,這給調(diào)試造成了一些麻煩,因?yàn)檎也坏竭@個(gè)函數(shù)對(duì)應(yīng)的symbol了。

這個(gè)時(shí)候,我們可以顯示地寫明某些函數(shù)我們不想inline:

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

否則,上面2個(gè)函數(shù),即便你代碼里面沒有寫inline,由于O2和Os使能了相關(guān)的inline選項(xiàng),也可能被編譯器自動(dòng)inline掉,如果我們想拒絕inline,可以通過noline來標(biāo)識(shí)。

4.我不想被優(yōu)化

在全局已經(jīng)使能O1, O2, O3, Os的情況下,某個(gè)單獨(dú)的函數(shù)我們不想做任何的優(yōu)化,可以用__attribute__((optimize("O0")))來修飾這個(gè)函數(shù),比如我們把上述用O2可以編譯過的代碼進(jìn)行如下修改:

Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些

重新用O2編譯:

$ gcc -O2 cc.c

/tmp/cc8M338p.o: In function `main':

cc.c:(.text+0x19): undefined reference to `f'

collect2: error: ld returned 1 exit status

5. 總結(jié)的話

下面給幾條實(shí)踐指南:

  1. 盡量不要嘗試用O0去編譯內(nèi)核,這不符合真實(shí)的工程實(shí)踐,也不太被主流Linux社區(qū)所支持;內(nèi)核依賴O2/Os去做較多的優(yōu)化;

  2. 追求你的代碼在O2的情況下,仍然是正確的,代碼要經(jīng)得起編譯優(yōu)化;比如O0工作正常,而O2不正常,應(yīng)該盡可能從自身找原因,分析匯編;

  3. 如果在全局優(yōu)化的情況下,想針對(duì)某個(gè)局部避免優(yōu)化,可以嘗試用noinline,__attribute__((optimize("O0")))等進(jìn)行外科手術(shù)式地調(diào)整。

以上是“Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁名稱:Linux編譯優(yōu)化必須掌握的知識(shí)點(diǎn)有哪些-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://jinyejixie.com/article32/csdgpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)公司電子商務(wù)、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
阜阳市| 平度市| 瑞安市| 胶州市| 上林县| 南康市| 永嘉县| 山阴县| 盐山县| 特克斯县| 甘泉县| 陕西省| 旬邑县| 安龙县| 绵竹市| 涡阳县| 沁源县| 通江县| 安图县| 苍梧县| 苍山县| 夏河县| 长汀县| 东乌| 高唐县| 渭南市| 盘锦市| 芦溪县| 双峰县| 揭西县| 三原县| 乌鲁木齐市| 辉南县| 信阳市| 桂林市| 鹤峰县| 安陆市| 东源县| 五指山市| 波密县| 安仁县|