2017-02-21 1 views
1

Когда 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 внутренней структуры от верхнего слоя?

+0

Так что материал, который не знает о SDS еще может (при определенных обстоятельствах), используйте его как 'char *', я бы предположил ... но я не думаю, что это вопрос, который действительно отвечает за SO. – hobbs

+0

@hobbs Возможно, это не для того, чтобы использовать его как 'char *', потому что 'sds' реализует собственную версию' strlen', 'strcat',' strcpy' и так далее. Этот вопрос пришел ко мне, когда я прочитал исходный код redis. Но я не мог понять это сам, поэтому я поднял его на SO. – lorneli

ответ

1

Именно то, что @hobbs сказал - ДСН выглядит как обычный буфер полукокса, так что вы можете использовать его с обычными строковыми функциями (например, зЬгстр)

Смежные вопросы