gpt4 book ai didi

c - Redis 源代码(简单动态字符串)中的一个 if-else block ,我无法理解

转载 作者:IT王子 更新时间:2023-10-29 06:06:53 25 4
gpt4 key购买 nike

首先,我真的很抱歉这个标题,但我不知道我还能怎么说。

我正在努力理解 Simple Dynamic Stringssds.c 的第 138-141 行之间有一个我无法理解的 if-else block 。我什至不知道它为什么在那里,我也不知道它有什么作用。

相关函数是:

/* Enlarge the free space at the end of the sds string so that the caller
* is sure that after calling this function can overwrite up to addlen
* bytes after the end of the string, plus one more byte for nul term.
*
* Note: this does not change the *length* of the sds string as returned
* by sdslen(), but only the free buffer space we have. */
sds sdsMakeRoomFor(sds s, size_t addlen) {
struct sdshdr *sh, *newsh;
size_t free = sdsavail(s);
size_t len, newlen;

if (free >= addlen) return s;
len = sdslen(s);
sh = (void*) (s-(sizeof(struct sdshdr)));
newlen = (len+addlen);
if (newlen < SDS_MAX_PREALLOC) /* unwind: line 138 */
newlen *= 2;
else
newlen += SDS_MAX_PREALLOC;
newsh = zrealloc(sh, sizeof(struct sdshdr)+newlen+1);
if (newsh == NULL) return NULL;

newsh->free = newlen - len;
return newsh->buf;
}

很抱歉提出这样一个菜鸟问题,但我们将不胜感激。

最佳答案

我假设您了解它的作用,但不了解为什么

如果计算的增量被认为“太小”,那是什么将分配的缓冲区大小的增量加倍以保存字符串。

原因是为了提高性能:如果字符串继续增长(如动态字符串能够做到的那样),Redis 将不需要尽快重新分配新的缓冲区,否则它必须这样做。这很好,因为 realloc() 成本很高。

基本上,它是通过消耗内存来购买性能,这是一种非常常见的权衡。

关于c - Redis 源代码(简单动态字符串)中的一个 if-else block ,我无法理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20144617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com