contributed by <ndsl7109256
>
注意作業要求,符合格式規範
qtest
得以支援list.h
還定義一系列操作,為什麼呢?這些有什麼益處?LIST_POISONING
這樣的設計有何意義?list_for_each_safe
和 list_for_each
的差異在哪?"safe" 在執行時期的影響為何?@
符號,這有何意義?你能否應用在後續的程式開發呢?
tests/
目錄底下的 unit test 的作用為何?就軟體工程來說的精神為何?tests/
目錄的 unit test 可如何持續精進和改善呢?先看一下 gcc 裡對 macro 的定義
A macro is a fragment of code which has been given a name. Whenever the name is used, it is replaced by the contents of the macro.
Macros
preprocessor 會在 compile 前將每個 macro 替換成事先 define 好的內容。程式可以直接循序執行,不像 function 要做 push 或 pop 的動作。如此一來便可節省時間。
但 macro 的缺點便是因為將每個 macro 展開運作,不像 function 使用固定的 memory ,會隨著使用次數的增長增加占用的 memory space。
藉由 top 查看 process 使用 memory 的情形,便可發現 macro 版的比 fuction 版的多用了點 memory
下 time 執行兩個程式發現 function 運行時間比 macro 多了 2 到 3 倍。
typeof 用於索引變數的 type ,可以吃兩種參數。
__extension__
此 macro 主要用於防止 gcc 產生警告,雖然我用 7.3.0 版本的 gcc ,就算把__extension__拿掉也不會產生警告。
((type *) 0)->member
((type *) 0) 用於得到一個 type 型態的 pointer ,其中的 0 換成其他整數也可以。再指向 member
offsetof定義在 <linux/stddef.h> 中,用來計算某一個struct結構的成員相對於該結構起始位址的 offset 。
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
將 member 的 addrss 減去 offset 便可得到 struct 的起始位置。
list.h
還定義一系列操作,為什麼呢?這些有什麼益處?LIST_POISONING
這樣的設計有何意義?確保不會使用到還沒初始化的 entry ,如果被 reference 將會產生 page fault
==poison.h==
Linux鏈結串列struct list_head 研究
在一個特定的排序中不斷循環時就需要使用到 circular linked list,在 CPU 排程就會使用到
可以快速的對尾端進行操作。
若操作不慎使得中間的 link 斷開,有機會復原。
可以實做一些環狀或是沒有明確頭尾的資料結構。
和
list_for_each` 的差異在哪?"safe" 在執行時期的影響為何?#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)
如果 list_for_each 裡面做刪除節點,可能連 head 本身都刪掉了,==pos != (head)==就無法做判斷了。
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
而 safe 版本的多了個 n 指向 pos 的 next ,確保, n 無效的話就會少走一次
不用了解 array 或 list 的實際物件數也可以做 traverse ,可讀性也比較好一點。
Doxygen 用於產生程式的說明文件,@有幾種常見用法。
tests/
目錄底下的 unit test 的作用為何?就軟體工程來說的精神為何?針對 function 逐個做測試,屬於軟體工程裡 Implementation 的過程,確認每個 function 皆正常執行後才能進到下個階段。
在每個 unit test 裡便用了許多 assert
確定每步皆正常執行。
tests/
目錄的 unit test 可如何持續精進和改善呢?sysprog
,2019spring