GCC 擴展

GNU C 允許聲明函數饰序、變量和類型的特殊屬性,以便手工的代碼優(yōu)化和更仔細的代

碼檢查规哪。要指定一個聲明的屬性求豫,在聲明后寫

__attribute__ (( ATTRIBUTE ))

其中 ATTRIBUTE 是屬性說明,多個屬性以逗號分隔诉稍。GNU C 支持十幾個屬性蝠嘉,這

里介紹最常用的:

* noreturn

屬性 noreturn 用于函數,表示該函數從不返回杯巨。這可以讓編譯器生成稍微優(yōu)化的

代碼蚤告,最重要的是可以消除不必要的警告信息比如未初使化的變量。例如:

++++ include/linux/kernel.h

47: # define ATTRIB_NORET ?__attribute__((noreturn)) ....

61: asmlinkage NORET_TYPE void do_exit(long error_code)

ATTRIB_NORET;

* format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)

屬性 format 用于函數服爷,表示該函數使用 printf, scanf 或 strftime 風格的參

數杜恰,使用這類函數最容易犯的錯誤是格式串與參數不匹配,指定 format 屬性可以

讓編譯器根據格式串檢查參數類型仍源。例如:

++++ include/linux/kernel.h?

89: asmlinkage int printk(const char * fmt, ...)

90: ? ? ? ? __attribute__ ((format (printf, 1, 2)));

表示第一個參數是格式串箫章,從第二個參數起根據格式串檢查參數。

* unused

屬性 unused 用于函數和變量镜会,表示該函數或變量可能不使用殴玛,這個屬性可以避免

編譯器產生警告信息童社。

* section ("section-name")

屬性 section 用于函數和變量,通常編譯器將函數放在 .text 節(jié)歌懒,變量放在

.data 或 .bss 節(jié)昼伴,使用 section 屬性匾旭,可以讓編譯器將函數或變量放在指定的

節(jié)中。例如:

++++ include/linux/init.h

78: #define __init ? ? ? ? ?__attribute__ ((__section__ (".text.init")))

79: #define __exit ? ? ? ? ?__attribute__ ((unused,

__section__(".text.exit")))

80: #define __initdata ? ? ?__attribute__ ((__section__ (".data.init")))

81: #define __exitdata ? ? ?__attribute__ ((unused, __section__

(".data.exit")))

82: #define __initsetup ? ? __attribute__ ((unused,__section__

(".setup.init")))

83: #define __init_call ? ? __attribute__ ((unused,__section__

(".initcall.init")))

84: #define __exit_call ? ? __attribute__ ((unused,__section__

(".exitcall.exit")))

連接器可以把相同節(jié)的代碼或數據安排在一起圃郊,Linux

內核很喜歡使用這種技術价涝,

例如系統(tǒng)的初始化代碼被安排在單獨的一個節(jié),在初始化結束后就可以釋放這部分

內存持舆。

* aligned (ALIGNMENT)

屬性 aligned 用于變量色瘩、結構或聯合類型,指定變量逸寓、結構域居兆、結構或聯合的對

齊量,以字節(jié)為單位竹伸,例如:

++++ include/asm-i386/processor.h

294: struct i387_fxsave_struct {

295: ? ? ? ? unsigned short ?cwd;

296: ? ? ? ? unsigned short ?swd;

297: ? ? ? ? unsigned short ?twd;

298: ? ? ? ? unsigned short ?fop;

299: ? ? ? ? long ? ?fip;

300: ? ? ? ? long ? ?fcs;

301: ? ? ? ? long ? ?foo;

......

308: } __attribute__ ((aligned (16)));

表示該結構類型的變量以 16 字節(jié)對齊泥栖。通常編譯器會選擇合適的對齊量,顯示指

定對齊通常是由于體系限制、優(yōu)化等原因吧享。

* packed

屬性 packed 用于變量和類型魏割,用于變量或結構域時表示使用最小可能的對齊,用

于枚舉钢颂、結構或聯合類型時表示該類型使用最小的內存钞它。例如:

++++ include/asm-i386/desc.h

51: struct Xgt_desc_struct {

52: ? ? ? ? unsigned short size;

53: ? ? ? ? unsigned long address __attribute__((packed));

54: };

域 address 將緊接著 size 分配。屬性 packed 的用途大多是定義硬件相關的結

構甸陌,使元素之間沒有因對齊而造成的空洞须揣。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钱豁,隨后出現的幾起案子耻卡,更是在濱河造成了極大的恐慌,老刑警劉巖牲尺,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵酪,死亡現場離奇詭異,居然都是意外死亡谤碳,警方通過查閱死者的電腦和手機溃卡,發(fā)現死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜒简,“玉大人瘸羡,你說我怎么就攤上這事〈瓴纾” “怎么了犹赖?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卷仑。 經常有香客問我峻村,道長,這世上最難降的妖魔是什么锡凝? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任粘昨,我火速辦了婚禮,結果婚禮上窜锯,老公的妹妹穿的比我還像新娘张肾。我一直安慰自己,他們只是感情好锚扎,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布捌浩。 她就那樣靜靜地躺著,像睡著了一般工秩。 火紅的嫁衣襯著肌膚如雪尸饺。 梳的紋絲不亂的頭發(fā)上进统,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機與錄音浪听,去河邊找鬼螟碎。 笑死,一個胖子當著我的面吹牛迹栓,可吹牛的內容都是我干的掉分。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼克伊,長吁一口氣:“原來是場噩夢啊……” “哼酥郭!你這毒婦竟也來了?” 一聲冷哼從身側響起愿吹,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤不从,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后犁跪,有當地人在樹林里發(fā)現了一具尸體椿息,經...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年坷衍,在試婚紗的時候發(fā)現自己被綠了寝优。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡枫耳,死狀恐怖乏矾,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情迁杨,我是刑警寧澤钻心,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站仑最,受9級特大地震影響,放射性物質發(fā)生泄漏帆喇。R本人自食惡果不足惜警医,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坯钦。 院中可真熱鬧预皇,春花似錦、人聲如沸婉刀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽突颊。三九已至鲁豪,卻和暖如春潘悼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爬橡。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工治唤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糙申。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓宾添,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柜裸。 傳聞我的和親對象是個殘疾皇子缕陕,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內容