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 的用途大多是定義硬件相關的結
構甸陌,使元素之間沒有因對齊而造成的空洞须揣。