首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么redis sds将buf部件暴露到上层而不是整个sdshdr

为什么redis sds将buf部件暴露到上层而不是整个sdshdr
EN

Stack Overflow用户
提问于 2017-02-21 05:24:59
回答 1查看 73关注 0票数 1

当redis创建一个sds (简单动态字符串)时,它在其整个sdshdr结构中,然后只返回buf部分。

代码语言:javascript
复制
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):

代码语言:javascript
复制
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内部结构吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-21 07:41:52

- sds看起来像一个普通的char缓冲区,所以您可以将它与常规字符串函数(例如strcmp)一起使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42359345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档