contributed by < ChienHisang
>
linux_kernel
電腦執行 function call 的方式將程式當前狀態暫時儲存在stack中,之後跳到function所在的記憶體位置執行完操作後,再跳回來(從stack pop)繼續執行。耗費記憶體尋址過程所需的時間,若程式中頻繁的呼叫function,則累積起來的時間成本不容小覷。macro的方式是當程式在編譯時會把主程式中呼叫函式的操作展開以至於主程式佔用的記憶體空間變大但相對的省下尋找記憶體位址的時間成本.
查了一下資料,在 c 語言中,使用inline關鍵字來實現 macro 的操作方式或是直接用 define 來實現,不同的是 inline 可以將函式呼叫的時間與函式包含的計算邏輯所需時間作比較,若計算邏輯所需時間大於函式呼叫時間,則編譯器並不會將此函式在主程式中展開,我們可以導出一個結論,macro使用情境為當函式中的負載相當輕量且大量出現在主程式中.
inline.c:
complie:
or
error:得到以下錯誤
此種直接在函數面前加上inline的寫法,必須要用O1以上的優化編譯才能順利通過,可是網路上一堆這種寫法… 原因待查中.
1.大量呼叫函式:
結果為
使用 define | 使用 function call | 使用inline
define效果最好,inline次之,function call最差
推論: inline 效能比 define 差的原因可能是多了一個是否需展開程式碼的判斷.
2.使用for大量呼叫函式:
結果為
使用 define | 使用 function call | 使用inline
三者差不多
推論:
1.macro 可能在回圈之中不會將程式展開
2.macro會展開但是大部分的時間花在for回圈本身記憶體尋址與條件判斷,因此macro效果不明顯
typeof 是 gcc 提供的擴展,主要功能是獲取括號內的型別.
typeof的參數可以是表達式或是類型.
此方式可以解決macro帶來的型別不確定
(type *) 0)
(((type *) 0)->member)
__typeof__(((type *) 0)->member) *__pmember = (ptr);
__pmember
利用typeof取得該type,並餵ptr
給該指標。offsetof(type,member)
(type *) ((char *) __pmember - offsetof(type, member));
待補…
待補…
可以在不增加tail指標(紀錄list結尾)的情況下,在尾端以O(1) insert data node.
提示:對照其他程式語言,如 Perl 和 Python
提示: 對照看 Doxygen