原创 Design Pattern之裝飾模式

裝飾模式(Decorator),動態地給一個對象添加額外的職責,就增加功能來說,裝飾模式比生成子類更爲靈活。 裝飾模式是爲已有功能動態添加更多功能的一種方式,當系統需要更新的時候,是向舊的類中添加新的代碼,這些新加的代碼通常裝飾

原创 設計模式之備忘錄模式

備忘錄模式是指在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可以將該對象恢復到原先保存的狀態。Memento模式比較適用於功能比較複雜的,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是

原创 Design Pattern之建造者模式

如果你需要將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示意圖時,我們需要建造者模式(Builder)。建造者模式可以將一個產品的內部表象與產品的生成過程分割開來,從而可以使一個建造過程生成具有不同的內部表

原创 Design Pattern之代理模式

本文主要介紹代理模式,顧名思義,代理模式指的是爲其他對象提供一種代理以控制對這個對象的訪問。 代理模式的應用: 1、遠程代理,也就是爲一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在不同地址空空間的事實。; 2

原创 Linux types.h頭文件min宏

#define min(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; })

原创 typeid 判斷對象類型是否一致

在編寫程序中,有時候需要判斷兩個對象是不是同一個類型,就需要用到typeid,通常有些人喜歡用type( obj ).name()去進行字符串的比較,這種比較方式的開銷是比較大的。在此,儘量使用hash_code()去進行比較,如下所示。

原创 Linux多線程之讀寫鎖

概述一般大家對讀寫鎖應該有一個認知,當讀數據比修改數據頻繁,我們可以採用讀寫鎖。讀寫鎖的分配規則如下:只要沒有線程持有某個給定的讀寫鎖用於寫時,那麼任意數目的線程可以持有該讀寫鎖用於讀;僅當沒有線程持有某個給定的讀寫鎖用於讀或寫時,才能分

原创 設計模式之訪問者模式

訪問者模式表示一個作用於某對象結構中的各元素的操作,它使你可以在不改變類的前提下定義作用於這些元素的操作。 訪問者模式的目的是要把處理從數據結構分離出來。很多系統可以按照算法和數據結構分開,如果這樣的系統有比較穩定的數據結構,又有易於變

原创 C++11 lamda表達式

lamda表達式可以被認爲是一個匿名的函數,之前不明白爲什麼C++11中會加入這個特性?匿名的函數能帶來什麼好處?有名的函數只不過增加了一些函數調用開銷而已,無傷大雅。下面開始走進lamda函數的世界。基本的Lamda函數int main

原创 Linux多線程之條件變量

上一節中,Linux多線程之互斥鎖最後遺留了一個問題,consumewait函數會一直輪詢檢查生產者是否生產好了條目,這樣很浪費CPU的時間,因此,需要有另外一種類型的同步,它允許一個線程(或進程)睡眠到發生某個事件爲止。互斥鎖用於上鎖,

原创 C++11 bind function

C++11標準中的std::bind和std::function是從boost中移植過來的。實踐證明,還是相當好用的,同時它們可以和lamda表達式一起用。下面我們想想這樣一個問題,比如我有一個類,這個類裏面有一個求加法的成員函數,但是我

原创 設計模式之命令模式

命令模式將一個請求封裝爲一個對象,從而使你可用不同的請求對客戶進行參數化,對請求排隊或記錄請求日誌,以及支持可撤銷的操作。 命令模式的UML圖如下所示: 代碼如下: class Barbecuer { public: Ba

原创 Valgrind工具使用

Valgrind附帶了一組工具,例如著名的memcheck工具。它執行某種調試、代碼分析或類似的任務,幫助您改進程序。Valgrind體系結構是模塊化的,因此可以輕鬆地創建新工具,而不影響現有結構。一系列有名的工具如下所示:1.Memch

原创 C++11 NULL與nullptr

C++11增加了nullptr空指針,以前我們常用NULL代表空指針,但是會存在問題,大家都知道NULL其實是一個宏定義,大多數是被定義成0。通過以下代碼可以看出NULL和nullptr的區別。struct Work { void Do

原创 c++11新特性之條件變量

std::condition_variable 是爲了解決死鎖而生的。當互斥操作不夠用而引入的。比如,線程可能需要等待某個條件爲真才能繼續執行,而一個忙等待循環中可能會導致所有其他線程都無法進入臨界區使得條件爲真時,就會發生死鎖。所以,c