2017-02-21 1 views
1

redisがsds(単純な動的文字列)を作成すると、それは全体としてsdshdr構造体に入り、buf部分を返します。なぜredis sdsがsdshdr全体の代わりにbuf部分を上層に公開するのですか

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

    struct sdshdr *sh; 

    if (init) { 
     sh = zmalloc(sizeof(struct sdshdr)+initlen+1); 
    } else { 
     sh = zcalloc(sizeof(struct sdshdr)+initlen+1); 
    } 

    if (sh == NULL) return NULL; 

    sh->len = initlen; 
    sh->free = 0; 

    if (initlen && init) 
     memcpy(sh->buf, init, initlen); 
    sh->buf[initlen] = '\0'; 

    // just return buf part 
    return (char*)sh->buf; 
} 

Redisのはsdsを操作する必要がある場合、それはsdshdr構造体へのポインタを計算する必要があります。 exapmleについて、sdsclear機能(sdsの怠惰な削除):

void sdsclear(sds s) { 
    // calculate the pointer to sdshdr 
    struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr))); 

    sh->free += sh->len; 
    sh->len = 0; 
    sh->buf[0] = '\0'; 
} 

は、上位層からsds内部構造を隠すためということですか? @hobbsが言ったまさに

+0

だから、SDSについて知らないものができ、まだ(右の状況下で)、それを 'char *'として使うと、私はそう思うでしょう...しかし、これは本当にSOに答えることができるような質問ではないと思います。 – hobbs

+0

@hobbsおそらく 'sds'は独自のバージョンの' strlen'、 'strcat'、' strcpy'などを実装しているので、 'char *'として使うのではないでしょう。私がredisのソースコードを読んだとき、この質問は私に来ました。しかし、私は自分自身でそれを理解することができませんでしたので、私はそれを上げました。 – lorneli

答えて

1

- SDSあなたが(例えばstrcmpの)通常の文字列関数でそれを使用することができますので、通常の文字バッファーのように見えます

関連する問題