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が言ったまさに
だから、SDSについて知らないものができ、まだ(右の状況下で)、それを 'char *'として使うと、私はそう思うでしょう...しかし、これは本当にSOに答えることができるような質問ではないと思います。 – hobbs
@hobbsおそらく 'sds'は独自のバージョンの' strlen'、 'strcat'、' strcpy'などを実装しているので、 'char *'として使うのではないでしょう。私がredisのソースコードを読んだとき、この質問は私に来ました。しかし、私は自分自身でそれを理解することができませんでしたので、私はそれを上げました。 – lorneli