Когда redis создает sds
(простая динамическая строка), он в целом содержит структуру sdshdr
, а затем просто возвращает часть buf.Почему redis sds выставляет часть buf на верхний слой вместо целого sdshdr
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
внутренней структуры от верхнего слоя?
Так что материал, который не знает о SDS еще может (при определенных обстоятельствах), используйте его как 'char *', я бы предположил ... но я не думаю, что это вопрос, который действительно отвечает за SO. – hobbs
@hobbs Возможно, это не для того, чтобы использовать его как 'char *', потому что 'sds' реализует собственную версию' strlen', 'strcat',' strcpy' и так далее. Этот вопрос пришел ко мне, когда я прочитал исходный код redis. Но я не мог понять это сам, поэтому я поднял его на SO. – lorneli