SDS 的定義

2018-02-24 15:46 更新

每個?sds.h/sdshdr?結(jié)構(gòu)表示一個 SDS 值:

struct sdshdr {

    // 記錄 buf 數(shù)組中已使用字節(jié)的數(shù)量
    // 等于 SDS 所保存字符串的長度
    int len;

    // 記錄 buf 數(shù)組中未使用字節(jié)的數(shù)量
    int free;

    // 字節(jié)數(shù)組,用于保存字符串
    char buf[];

};

圖 2-1 展示了一個 SDS 示例:

  • free?屬性的值為?0?, 表示這個 SDS 沒有分配任何未使用空間。
  • len?屬性的值為?5?, 表示這個 SDS 保存了一個五字節(jié)長的字符串。
  • buf?屬性是一個?char?類型的數(shù)組, 數(shù)組的前五個字節(jié)分別保存了?'R'?、?'e'?、?'d'?、?'i'?、?'s'?五個字符, 而最后一個字節(jié)則保存了空字符?'\0'?。

SDS 遵循 C 字符串以空字符結(jié)尾的慣例, 保存空字符的?1?字節(jié)空間不計算在 SDS 的?len?屬性里面, 并且為空字符分配額外的?1?字節(jié)空間, 以及添加空字符到字符串末尾等操作都是由 SDS 函數(shù)自動完成的, 所以這個空字符對于 SDS 的使用者來說是完全透明的。

遵循空字符結(jié)尾這一慣例的好處是, SDS 可以直接重用一部分 C 字符串函數(shù)庫里面的函數(shù)。

舉個例子, 如果我們有一個指向圖 2-1 所示 SDS 的指針?s?, 那么我們可以直接使用?stdio.h/printf?函數(shù), 通過執(zhí)行以下語句:

printf("%s", s->buf);

來打印出 SDS 保存的字符串值?"Redis"?, 而無須為 SDS 編寫專門的打印函數(shù)。

圖 2-2 展示了另一個 SDS 示例:

  • 這個 SDS 和之前展示的 SDS 一樣, 都保存了字符串值?"Redis"?。
  • 這個 SDS 和之前展示的 SDS 的區(qū)別在于, 這個 SDS 為?buf?數(shù)組分配了五字節(jié)未使用空間, 所以它的?free?屬性的值為?5?(圖中使用五個空格來表示五字節(jié)的未使用空間)。

接下來的一節(jié)將詳細地說明未使用空間在 SDS 中的作用。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號