contributed by < Laurora
>
#define MACRONAME 指令或常數
#define
定義一段指令或常數,當 preprocessor 掃描到程式中 macroname 表示時,便會使該 macro 表示的指令或常數替換。看起來和 function call 很像,為什麼不用 function call 就好了?
push
和 pop
來存取傳入變數和 function 位置,時間成本增加,當 function call 大量使用時便會浪費掉許多時間。設計實驗來驗證上述說法,搭配反組譯結果的解讀
typeof 是 gcc 對 C 語言中的一個 extension
主要功能是回傳參數的 type
傳入 typeof 的參數可以有兩種形式: expression 或是 type
expression
這邊假設陣列 x 存取指向 function 的 pointer, typeof 便可以得到 function 回傳的 type
也可以直接輸入 type , typeof 得到的就是 int *
當使用 macro 定義 type 時,因不確定傳入的變數的 type ,因此需要 typeof 找到該變數的 type 避免執行錯誤。
((type *) 0)->member
: 0
的 type 是 pointer to type 並指向 master
__typeof__(((type *) 0)->member)
: 用 typeof 取得 master
的 type
__typeof__(((type *) 0)->member) *__pmember
:宣告 *__pmember
, type 為 master
的 type
__typeof__(((type *) 0)->member) *__pmember = (ptr);
: *__pmember
的位址為 (ptr)
offsetof 的用途是計算 structure member 的 offset ,以 byte 為單位 return structure memeber的 offset
__extension__
: 告訴 gcc 不要提出警告
(char *) __pmember - offsetof(type, member);
: 則以 __pmember
減去 member
在 type
這個 structure 的 offset,可以得到這個 type 的起始位址
(type *) ((char *) __pmember - offsetof(type, member));
:宣告此起始位址為 pointer to type
list.h
還定義一系列操作,為什麼呢?這些有什麼益處?更完善 list.h
的功能,考量不同情況的呼叫,避免發生程式嚴重錯誤。
不要用字面意思解讀,善用案例解釋 (及早脫離「文組TM」)
show me the code!
LIST_POISONING
這樣的設計有何意義?排序可以使資料搜尋變得更快,現實生活中的應用如:
在 Linux kernel 中的應用如:
參考:Basic Data Structures and Algorithms in the Linux Kernel
用實際程式碼解說,附上分析和實驗
list_for_each_safe
和 list_for_each
的差異在哪?"safe" 在執行時期的影響為何?list_for_each_safe
:會額外將 node 的下一個記錄在 save
,可避免刪除 node 後會找不到下一個 node。list_for_each
:不紀錄 node->next ,因此在刪除 node 時可能產生 dangling pointerfor_each 是 c++ 提供的 funtion templete ,可直接呼叫該函式回傳開發者要的結果。
本處是探討 Linux linked list macro,而不是 C++ 語言特徵
FOREACH
和 FOREACH_SAFE
幫助迭代整個 list ,若需要從 list 中刪除元素則需要用到 FOREACH_SAFE
FOREACH
和 FOREACH_SAFE
對開發者而言, for_each 提供了一個比較通用的函式幫助迭代,只要呼叫函式,將需要處理的變數傳入函式即可,而不需要自己從 for/while 迴圈開始寫,不只可讓程式可讀性變得更高,開發者所遇到的錯誤會更少。
而在編譯器的處理上,編譯器對於這種已經包裝好的函式——不同於 for/while 必須對迴圈內的程式有 break, continue 的可能——不須多做預測與處理,讓編譯器可對整個程式效能做更好的改進。
若要將 array 中的所有 element 相加,不使用 for_each 實做可能會長這樣:
在 Python 中可以直接用三行程式碼就達到上面程式碼的效果
在函式導入或是物件呼叫變得複雜,開發者所遇到的困難或是錯誤可能會更多,此時 for_each 風格的使用能更簡化程式的呈現。
@
符號,這有何意義?你能否應用在後續的程式開發呢?Doxygen 能自動從程式中生成註解, @
符號的功能是讓開發者呼叫特定的註解。
tests/
目錄底下的 unit test 的作用為何?就軟體工程來說的精神為何?tests/
目錄的 unit test 可如何持續精進和改善呢?