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 類...