資料結構之動態字串

2021-09-25 10:13:05 字數 1204 閱讀 3057

//型別別名,用於指向 sdshdr 的 buf 屬性

typedef char *sds;

//儲存字串物件的結構

struct sdshdr ;

動態字串是redis的基礎資料結構之一,這裡並沒有簡單地只用c中常用的char *型別來儲存字串,而是建立了乙個sdshdr的結構體,該結構體包含三個組成元素,欄位len儲存字串的實際長度,free記錄申請的剩餘空間,buf儲存真正的字串內容。

因為這樣乙個結構體的存在,當要獲取字串的長度時,就不必像傳統的c語言那樣遍歷字串然後通過計數最後得到組付出長度,這裡直接通過len欄位就可以獲取,時間複雜度由o(n)變為o(1)。

另外,根據給定的字串初始化該結構體時,最終呼叫的是sdsnewlen(const void *init, size_t initlen)方法。如下:

sds sdsnewlen(const void *init, size_t initlen)  else 

// 記憶體分配失敗,返回

if (sh == null) return null;

// 設定初始化長度

sh->len = initlen;

// 新 sds 不預留任何空間

sh->free = 0;

// 如果有指定初始化內容,將它們複製到 sdshdr 的 buf 中

if (initlen && init)

memcpy(sh->buf, init, initlen);

// 以 \0 結尾

sh->buf[initlen] = '\0';

// 返回 buf 部分,而不是整個 sdshdr

return (char*)sh->buf;

}

該方法有兩個形參,第乙個形參*init儲存的是字串本身,第二個initlen記錄的是該字串長度。初始化結構體首先是在記憶體中動態申請一段儲存空間,長度是sizeof(struct sdshdr)+initlen+1,第一部分是結構體本身的長度,中間部分是該字串本身的長度,最後的1儲存的是空字元'\0',以作為字串的結尾。若分配失敗則返回null,反之則給結構體中各欄位賦值。注意,該方法最終返回的是字串本身部分,也就是sds型別,而不是整個sdshdr。

然而實際情況一般都是只有乙個引數,也就是字串本身,這時就先需要通過方法strlen()求出字串長度,然後再呼叫上述方法初始化。

Redis 字串的資料結構之動態字串 SDS

總結 struct sdshdr 效率差異 和c字串不同,因為sds在len屬性中記錄了sds本身的長度,所以獲取乙個sds長度的複雜度僅為o 1 緩衝區溢位 空間預分配策略與惰性空間釋放策略 當sds修改後的長度小於1mb時,將會預分配大小和當前len一樣的空間 free len 也就是使空間增長...

資料結構之字串

夢醒瀟湘love 1 串的相關概念 1 串 string 是由零個或多個字元組成的有限序列,又名叫字串。2 串中含有的字元資料稱為串的長度,零個字元的串稱為空串 null string 它的長度為零。3 子串與主串,串中任意個數的連續字元組成的子串行稱為該串的子串,相應地,包含子串的串稱為主串。4 ...

資料結構之 字串

一 簡介 字串或者說串 string 是由數字 字母。下劃線組成的一串字元。一般可以記為s a0a1a2a3.an n 0並且n是有限非負整數 從資料結構上來看,用c 來說,字串是一種特殊的線性表,也就是裡面的每個元素都是字元的一種線性表。可以是用陣列實現,或者鍊錶實現。具體的優缺點可以參照陣列和鍊...