我正在阅读redis的源代码。 这是代码:
typedef char *sds;
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
static inline size_t sdslen(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->len;
}
static inline size_t sdsavail(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->free;
}
关于此代码,我遇到了一些问题:
sizeof(struct sdshdr)
8的输出?为什么不包括char buf[]
?size_t sdslen
和sdsavail
。为什么struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
?答案 0 :(得分:1)
struct
。sh
设置为指向通过取s
的值char *
计算的内存,并减去sds标头的大小。换句话说,从指向字符串的第一个字符的指针(灵活的数组成员),我们计算一个指向标题本身的指针,这样我们就可以获得长度。答案 1 :(得分:1)
<{1}}中的
size_t
,属于s
,是*sds
<的typedef p>
这导致在内存中实现此代码。
char
,它存储的内存空间等于sh sdshdr struct。