谷歌LevelDB之原始碼分析之1

2021-07-11 02:50:25 字數 2421 閱讀 2692

先貼**,自己根據原始碼手動敲了一遍,增加點感覺.
#include #include namespace google

; slice(const char*d, size_t s) :data_(d), size_(s) {}

slice(const std::string&s) :data_(s.data()), size_(s.size()) {}

slice(const char*d) :data_(d), size_(strlen(d)) {}

~slice()

public:

const char* data()const

size_t size()const

bool empty()const

char operator(size_t n)const

void clear()

void remove_prefix(size_t n)

std::string tostring()const

int compare(const slice&b)const;

bool starts_with(const slice&x)const

private:

const char* data_;

size_t size_;

}; inline bool operator==(const slice&x, const slice&y)

inline bool operator!=(const slice&x, const slice&y)

int slice::compare(const slice&b)const

else if (size_ > b.size_)

}return r; }}

原始碼中slice該資料結構廣泛使用,其簡潔的封裝而又完美的封裝體現谷歌**之簡潔美而又不失效率之特點。

1.該類之封裝了2個資料成員:char*和非負整型;
2.在c++中,若類具有個單引數的建構函式,比如:slice(const std::string&s)和slice(const char*d)則可以進行型別的隱式轉換
例如:定義函式void fun(const slice&);
變數:	string str;
char* pch = "hello,world";
則可以使用fun(str)及fun(pch)對fun的呼叫:其中string與char*均隱式轉換成了slice型別;
在c++primer第四版中,曾提出避免這類隱式轉換,若需要可以採用顯式轉換的方式:如fun(slice(str))及fun(slice(pch));
在c++中,採用關鍵字explicit修飾單引數建構函式以避免型別的隱式轉換:例 explicit  slice(const std::string&s);則必須使用fun(slice(str))進行fun函式的呼叫;
在此處,因為對於leveldb要進行大量的put,get資料操作,則谷歌使用了隱式型別轉換。
3.運算子過載:對於2個slice型別的比較,實質是兩個常量字串的比較,這類問題在面試中經常遇到,在此處,谷歌使用記憶體比較的方式處理:首先獲取2個字串之間的最小長度,然後呼叫memcmp函式進行比較。
注:int memcmp(const void *buf1, const void *buf2, unsigned int count);
int memcmp(const void *buf1, const void *buf2, unsigned int count);
使用該演算法效率很高,比常見的字元迴圈比較效率要高出甚多。
在此處,先過載==運算子,再呼叫==過載!=運算子。
4.這段**及其簡單,但是具有很多其他細節值得我們去學習:
1》內聯函式的使用;
2》const的使用;
3》關係表示式的簡潔寫法;
4》assert斷言的合理使用;
5》盡量使用庫函式,少自己實現演算法,畢竟自己手動寫的演算法不如經過工業考驗的庫函式效率高,例memcmp的使用。

leveldb原始碼剖析1 1 基礎概述之原始碼搭建

leveldb是乙個開源的單機kv儲存庫,其作者是谷歌工程師jeff dean和sanjay ghemawat。很多開源lsm儲存引擎都基於或使用leveldb,例如rocksdb。關鍵原始碼目錄介紹 其中,db和table是功能的核心,部分資料結構在util中。如果沒做過資料庫引擎的人,建議看 以...

leveldb原始碼分析1

leveldb是乙個key value型的儲存引擎,由google開發,並宣布在bsd許可下開放源 plain git clone plain cd leveldb make all 此時生成libleveldb.a庫檔案。拷貝leveldb的標頭檔案到 usr include下 plain cp ...

levelDB原始碼分析 SSTable

sstable是bigtable中至關重要的一塊,對於leveldb來說也是如此,對leveldb的sstable實現細節的了解也有助於了解bigtable中一些實現細節。本節內容主要講述sstable的靜態布局結構,sstable檔案形成了不同level的層級結構,至於這個層級結構是如何形成的我們...