Linux模式設計2 資料比較

2021-06-20 19:21:22 字數 1086 閱讀 7071

-------------------------------------------

-------------------------------------------

由於linux**採用gcc編譯器編譯,所以它可以採用gcc對c語言的擴充套件特性,以實現高效的**。其中運用非常廣泛的擴充套件就是復合語句。gcc把包含在圓括號和大括號雙層括號內的復合語句看作是乙個表示式,它可以出現在任何允許表示式的地方,而復合語句中可以宣告區域性變數,以及迴圈條件判斷等複雜處理。而表示式的最後一條語句必須是乙個表示式,它的計算結果作為返回值。

int a =()

; 上例中符合表示式中宣告了區域性變數_a,而返回值為++_a的結果,所以a的值為1。基於這種擴充套件,核心可以通過在復合語句中定義區域性變數而表面自加自減運算子的***問題。核心中的min_t和max_t巨集就是這樣實現的。

include/linux/kernel.h

#define min_t(type, x, y)()

#define max_t(type, x, y)()

儘管多數時候通過使用這類巨集,可以避免引數的***,但是這會增加記憶體的開銷和執行效率,所以如果能夠保證引數不存在***,那麼使用通常的如下定義即可:

#define min(a, b)

((a)

>

(b)?

(b):

(a))

#define max(a, b)

((a)

>

(b)?

(a):

(b))

以上的min_t和max_t巨集適需要提供資料型別,typeof的出現使這一步也可被省略。

include/linux/kernel.h

#define min(x, y)()

#define max(x, y)()

觀察min和max的實現,它們通過typeof獲取x和y的型別,然後定義區域性變數以消除引數***。注意到中間的比較運算,如果x和y的型別不同,那麼編譯器將提示如下警告資訊,這對檢查**很有幫助。

***.c:35: warning: comparison of distinct pointer types lacks a cast

設計模式比較

一 模式 1感性認識 即代別人理事物 使用場景有同級別物件間的傳值,比如前後控制器之間,也可以是外層裡層物件間的傳值,比如控制器和其檢視或模型間的傳值 二單例模式 全域性共享資源 三比較1block回掉比 回掉更方便,但是block式是利用物件屬性傳值,似乎只適合物件對另一物件的值傳遞 檢視對控制器...

設計模式 建立型模式比較

在gof的 design patterns elements of resuable object oriented software 中列舉了5類建立型的設計模式,包括工廠方法模式 factory method 抽象工廠模式 abstract factory 生成器模式 builder 單件模式 ...

常用設計模式的比較

分類設計模式 建立型工廠方法模式 factory method 抽象工廠模式 abstract factory 建造者模式 builder 原型模式 prototype 單例模式 singleton 結構型介面卡模式 adapter 橋接模式 bridge 組合模式 composite 裝飾器模式 ...