国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux編譯優(yōu)化必須掌握的幾個姿勢總結(jié)

2024-08-28 00:02:05
字體:
供稿:網(wǎng)友

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

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

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

當(dāng)選擇了

CONFIG_CC_OPTIMIZE_FOR_SIZE

它會是Os,否則就是O2。

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

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

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

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

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

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

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

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

02、一個簡單的例子

下面的代碼:

O0編譯會報如下錯,說f()函數(shù)沒有定義:

$ gcc -O0 cc.ccc.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編譯,它意識到a==1,所以if(a>2),它不會成立,所以f()沒有定義也沒有關(guān)系。

把代碼稍微改一下后:

O2這個時候也不行了:

$ 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

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

3.我們不想inline了

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 雷波县| 高尔夫| 盐池县| 蒙城县| 平果县| 西乌| 四子王旗| 揭阳市| 陆良县| 太仓市| 鹿泉市| 灵台县| 安宁市| 澎湖县| 屏东市| 集安市| 洛浦县| 南召县| 炎陵县| 杭锦后旗| 连江县| 垫江县| 于都县| 政和县| 安多县| 阜南县| 乐业县| 台南县| 牙克石市| 墨竹工卡县| 长宁县| 贺兰县| 芒康县| 玉树县| 乌海市| 曲松县| 维西| 恩施市| 海南省| 都兰县| 英山县|