1.#define中使用do{statement}while(0)
保證statement無論在何處都能正確執行一次
2.將鏈表操作抽象出來,與宿主結果相互獨立。所有的鏈表操作都作用與list_head,然後通過宏
#define list_entry(ptr, type, member)
container_of(ptr, type, member)
獲取宿主結構的地址,以前版本的linux的定義稍有不同,不過更能體現精髓:
#define list_entry(ptr, type, member)
((type *)((char *)(ptr)(
unsigned long)(&((type *)0)>
member)))
很精辟,效率也很高,比後來的C++的面向對象的ADT效率高。
3.當一個數據結構被多個“用戶”(此處用戶指使用數據結構的一切對象)使用時,在內核中實際上只需要分配一個就行了,每個用戶只需將指針指這個數據結構就行了。分配函數中,如果此結構還不存在就分配一個,初始化其引用計數器為1,如果存在的話,只需簡單地將引用計數器加1就行了。析構函數中,只需將引用計數器減1,如果減到0再釋放內存空間。這種技巧的核心在於利用指針實現內存的共享,而內存本身采用引用計數器來記錄引用次數。這樣可以極大節省空間。 這個技巧貌似在Windows內核中也有使用。
4.使用likely和unlikely來指導gcc對代碼進行分支預測的優化。二者的定義為:
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)