第二步:學習一些閱讀源碼的基礎知識
【關於《BCH源碼學習筆記》】
第二步:學習一些閱讀源碼的基礎知識(c++庫的學習)
BCH源碼使用C++實現的,實現的過程中,使用了很多第三方的函數庫,我們在閱讀源碼之前,對這些使用到的函數庫大致瀏覽一下,可以讓我們閱讀代碼事半功倍。
備註:
為了便於介紹我將一些函數也作為單獨的庫來介紹
其中的庫管網鏈接是延伸閱讀,可以對這個庫了解的更加詳細
庫例子是我篩選的一些代碼例子或者介紹,以便大家從另一個角度對這個庫有直觀印象
如果只是看代碼,針對基礎知識只要有個印象,真正看代碼的時候,哪裡看不懂,可以回過頭來再看。
一、C++庫的學習
1.Boost
庫名稱:
Boost
庫介紹:
Boost是一個開源、跨平台、功能強大的c++庫,並且是除了stl外最常用的庫,實現了很多基本操作,能讓開發變得更加簡單、快捷,當前最新版本是1.67.0。
庫例子:
2.Signals2
庫名稱:
Signals2
庫介紹:
Signals2是基於Boost的另一個庫Signals,實現了線程安全的觀察者模式。
觀察者模式是指定義對象間的一種一對多的依賴關係,當一個對象發生改變時,所有依賴於它的對象都將得到通知並自動更新。
在Signals2庫中,觀察者模式又被稱為信號/插槽(Signals and slots)。
通俗的來講,信號就是一個觸發器,插槽就是一些列的回調函數,當信號發射時,也就是觸發器被觸發的時候,所有的回調函數都會被調用。信號/插槽機制功能就是把這些功能相關的函數彙集到一起,在某一時刻,按順序依次調用。
庫例子:
3.Bind
庫名稱:
Bind
庫介紹:
bind並不是一個單獨的類或函數,而是非常龐大的家族,依據綁定的參數個數和要綁定的調用對象類型,總共有數十個不同的形式,但它們的名字都叫做bind,編譯器會根據具體的綁定代碼自動確定要使用的正確形式。
bind接受的第一個參數必須是一個科調用對象f,包括函數指針、函數引用、成員函數指針和函數對象,之後bind接受最多九個參數,參數的數量必須與f的參數數量相等,這些參數將被傳遞給f作為形參。
綁定完成後,bind會返回一個函數對象,它內部保存了f的拷貝,具有operator(),返回值類型被自動推導為f的返回值類型。在發生調用時,這個函數對象將把之前存儲的參數轉發給f完成調用。
簡單來說,Bind的功能就是對一個函數綁定某些參數,其中參數有一個很重要的概念叫做佔位符,被定義為從_1到_9
庫例子:
4.Thread
庫名稱:
Thread
庫介紹:
線程,是各種項目中經常會用到的一個技術,而一般提到線程都會涉及到多線程,多線程當中最經典的問題就是同步訪問共享資源,和其他幾乎所有語言一樣boost也是通過提供互斥鎖來解決的,但不同的是boost提供了多個互斥類,使得項目可以更靈活的處理共享資源。
庫例子:
5.Chrono
庫名稱:
Chrono
庫介紹:
Chrono是Boost庫中用於時間處理的庫,主要包含三個概念時間段(duration),時間點(time_point)和時鐘(clock)。
庫例子:
6.Test
庫名稱:
Test
庫介紹:
Boost中Test模塊是用來給代碼做單元測試的,測試的方法是白盒測試,所以編寫測試必須對待測試的模塊有深度的理解,然後再對正常功能和可能會出現的問題進行測試,測試的實際過程就是給定輸入判定是否和預期的輸出相同,所以Test本質上也是個驗證等式的工具外加了一層包裝。
測試過程中三個主要的工具是BOOST_WARN、BOOST_CHECK、BOOST_REQUIRE。
BOOST_WARN(sizeof(green) > sizeof(char));
BOOST_CHECK(c == 2); // BOOST_CHECK斷言失敗繼續執行
BOOST_REQUIRE(yellow > red); //BOOST_REQUIRE斷言失敗,測試停止
另外,對於浮點數比較,BOOST還提供了BOOST_CHECK_CLOSE_FRACTION(left-value, right-value, tolerance-limit),調用的過程中left-value和right-value的類型要一致,否則會報錯。
TEST中還有一個比較重要的概念是叫做TEST FIXTURE,是指為測試case開始時設置一個上下文環境,測試結束時清楚環境。具體來說就是定義一個新的對象在對象的構造函數中完成環境設置工作,在對象的析構函數中完成清除工作。
庫例子:
7.Program options
庫名稱:
Program options
庫介紹:
在編寫命令行程序時,經常會碰到的一個問題就是參數解析問題,就是說我們在運行程序時給程序附上不同的參數值使得程序能夠完成不同的功能。而boost中的program options就是用來處理命令行傳入的參數的模塊,使得程序更簡潔高效。
庫例子:
8.Libevent
庫名稱:
libevent
庫介紹:
libevent是一個輕量級的開源的高性能的事件觸發的網路庫,適用於windows、linux、bsd等多種平台,內部使用select、epoll、kqueue等系統調用管理事件機制。它被眾多的開源項目使用,例如大名鼎鼎的memcached等。
特點:
? 事件驅動,高性能;
? 輕量級,專註於網路(相對於ACE);
? 開放源碼,代碼相當精鍊、易讀;
? 跨平台,支持Windows、Linux、BSD和Mac OS;
? 支持多種I/O多路復用技術(epoll、poll、dev/poll、select和kqueue等),在不同的操作系統下,做了多路復用模型的抽象,可以選擇使用不同的模型,通過事件函數提供服務;
? 支持I/O,定時器和信號等事件;
? 採用Reactor模式。
主要的功能:
Libevent提供了事件通知,io緩存事件,定時器,超時,非同步解析dns,事件驅動的http server以及一個rpc框架。
? 事件通知:當文件描述符可讀可寫時將執行回調函數。
? IO緩存:緩存事件提供了輸入輸出緩存,能自動的讀入和寫入,用戶不必直接操作IP。
? 定時器:libevent提供了定時器的機制,能夠在一定的時間間隔之後調用回調函數。
? 信號:觸發信號,執行回調。
? 非同步的dns解析:libevent提供了非同步解析dns伺服器的dns解析函數集。
? 事件驅動的http伺服器:libevent提供了一個簡單的,可集成到應用程序中的HTTP伺服器。
? RPC客戶端伺服器框架:libevent為創建RPC伺服器和客戶端創建了一個RPC框架,能自動的封裝和解封數據結構。
庫例子:
下一期將和大家繼續分享《BCH源碼學習筆記》的《第二步:學習一些閱讀源碼的基礎知識》,跟大家談一談C++重要概念學習(template)。歡迎關注!


※陽光七星投資集團主席:區塊鏈投資可從三點著手
※如何給網路披上鎧甲?
TAG:巴比特資訊 |