C 中string類和Redis中SDS的比較

2021-07-10 16:45:49 字數 1586 閱讀 5246

sds (****** dynamic string,簡單動態字串)是 redis 底層所使用的字串表示, 幾乎所有的 

redis 模組中都用了 sds。

sds 在 redis 中的主要作用有以下兩個:

1.實現字串物件(stringobject);

2.在 redis 程式內部用作 char* 型別的替代品。

在 c 語言中,字串可以用乙個 \0 結尾的 char 陣列來表示。

這種簡單的字串表示,在大多數情況下都能滿足要求,但是,它並不能高效地支援長度計算和

1.每次計算字串長度(strlen(s))的複雜度為 o(n) 。

2.對字串進行 n 次追加,必定需要對字串進行 n 次記憶體重分配(realloc)。

redis 命令中的直接對映, 這兩個簡單的操作不應該成為效能的瓶頸。

另外, redis 除了處理 c 字串之外, 還需要處理單純的位元組陣列, 以及伺服器協議等內容。

所以為了方便起見, redis 的字串表示還應該是二進位制安全的: 程式不應對字串裡面儲存的資料做

任何假設, 資料可以是以 \0 結尾的 c 字串, 也可以是單純的位元組陣列, 或者其他格式的資料。

考慮到這兩個原因, redis 使用 sds 型別替換了 c 語言的預設字串表示: sds 既可高效地實現

追加和長度計算, 同時是二進位制安全的。

1.常數複雜度獲取字串長度。

2.杜絕緩衝區溢位。

3.減少修改字串是帶來的記憶體衝分配次數(1.空間預分配 2.惰性空間釋放)。

4.二進位制安全。

以這幾個方面來分析c++中string類和sds的區別。

1.string類同樣可以以常數複雜度獲取字串長度。因為string類內部具有記錄字串長度的私有成員,

隨著對字串的操作其值也會改變,時刻保持著對應的字串長度。

2.string類杜絕緩衝區溢位。如果在向string類新增元素時,沒有足夠的空間容納新容器,則

string類必須分配新的記憶體空間來儲存以有元素和新元素,將以有元素從舊位置移動到新空間中,然後新增新元

素,釋放舊儲存空間。

3.(1)string類中也有對空間的預分配,並且比sds更加靈活,我們可以用reserve(n)函式對其預分配進

行控制。而sds有其特定的預空間分配機制,我們也可以以string來實現

(2)string類中並沒有明顯的惰性空間釋放,但是對string來說當它需求大小小於當前容量時也不會退回內

存空間。但是c++11引入了shrink_to_fit函式可以主動的退回string中不需要的記憶體空間,但需要我們顯示的

呼叫。 4.string類同樣保證了二進位制安全,其內部也並不以空字元為結尾的標誌。他同樣定義了記錄其字串大小

的成員。所以同樣保證了二進位制的安全。

到最後的比較中有一點最終決定放棄了string類的使用。

因為string類中在初始化時並不會對字串進行預分配,所以會導致在一定的情況下,string類的分配操

作會比sds中的分配操作更多。

C 中string類詳解

1 string 型別的建構函式 string s 定義乙個空的 string 型別 預設建構函式 string s cp 用cp c風格的字串 初始化 string 物件string s s1 用string 物件s1 初始化s string s n,c 將s 初始化為 c 的 n個副本 stri...

Redis資料庫(string和hash型別)

一.string型別 string型別是redis中最簡單的型別,乙個key對應乙個value,redis的string可以包含任何資料物件,比如jpg或者序列化的物件。關於string型別的操作如下 1 set和get set用來設定乙個鍵值對,例如 set name acdreamer 意思就是...

C 中如何定義string類?

string類使用起來比較方便,在本課程的開始我們就學習了 string 類。之所以那麼早就學習 string 就是希望大家能夠用 string代替c 風格的字串。目前為止,我們學習了如何定義類,以及如何為類定義運算子過載函式。今天我們就來定義乙個類似於 string 功能的自己的 string 類...