contributted by < chengWei1123
>
節錄自: F02: list
回答「自我檢查清單」的所有問題,需要附上對應的參考資料和必要的程式碼
自我檢查事項:
list.h
還定義一系列操作,為什麼呢?這些有什麼益處?LIST_POISONING
這樣的設計有何意義?list_for_each_safe
和 list_for_each
的差異在哪?"safe" 在執行時期的影響為何?@
符號,這有何意義?你能否應用在後續的程式開發呢?
tests/
目錄底下的 unit test 的作用為何?就軟體工程來說的精神為何?tests/
目錄的 unit test 可如何持續精進和改善呢?從 linux-list 學習裡頭的技巧,包含裡頭 unit test 的設計,透過給定的 linked list 操作,實作出 merge sort
附上你的修改過程,也需要讓 qtest
得以支援
可將 dict 裡頭的測試資料拿來作效能分析的輸入
思考提升排序效率的方法,需要做平均和最壞狀況的分析
macro 只是單純的文字替換,雖然會增加 code section 的大小,但能省去 call function 時對stack 的操作,進而加快執行速度。
另外,我覺得 macro 在某些情況會比 function 更具彈性,例如 list.h 中的 list_for_each
programmer 只要在呼叫 macro 後加上對 list node 的操作就好,而這一點使用 function 可能就比較難做到(可能要把對 list node 的操作寫成 function ,再把 function pointer 當成參數傳入 list_for_each function )。
下面是我在 Macro vs Function in C 看到有人對 macro 和 function 的優缺點所做的統整
Macro features:
Function features:
不要只摘錄網路上的討論文字,設計實驗來檢驗,附上組合語言和 cycle count 分析,及早脫離「文組TM」
jserv
考慮以下程式碼 test.c
argv[1] 為 0 則使用 macro, 否則用 function ; argv[2] 則為各層迴圈數。
result :
typeof(x) 會回傳 x 的 type
其中 x 可以是變數也可以是 type
例如:
相當於
相當於
__extension__
__extension__
來避免{ }
__typeof__(((type *) 0)->member) *__pmember = (ptr);
(type *) 0
:__typeof__(((type *) 0)->member)
:__typeof__(((type *) 0)->member) *__pmember
:__typeof__(((type *) 0)->member) *__pmember = (ptr)
雖然看得懂這行在做什麼,但不太明白其中的必要性
offsetof(type, member)
:(char *) __pmember - offsetof(type, member)
:list.h
還定義一系列操作?LIST_POISONING
這樣的設計有何意義?list_for_each_safe
和 list_for_each
的差異在哪?@
符號,這有何意義?tests/
目錄底下的 unit test 的作用為何?tests/
目錄的 unit test 可如何持續精進和改善呢?應列出你的思路和規劃,不是急著列出程式碼。
需要提及驗證正確性和時間/空間複雜度分析
jserv
merge sort 主要有三個工作
把 input list 分成 2 等分
分別對這兩個 list 做排序
合併兩個 sorted list
random_shuffle_array 所產生的數據 (average case for all)