sds对象创建
1. sds的五种结构体
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KXtEKaEr-1651756613871)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/406621e3-b0cb-4cd7-b714-59ee272062ff/Untitled.png)]](https://img-blog.csdnimg.cn/243e0c99214840459d0d79f0ebd325d2.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PiGiaopF-1651756613873)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/cc5f0f7e-9549-4d42-976d-870c1e2df7cb/Untitled.png)]](https://img-blog.csdnimg.cn/586760e773a44f15bd6b3e59ddcf76fd.png)
2.sds创建步骤:
- 根据初始化长度获取sdshdr类型
- 根据类型获取sdshdr指定类型的结构头的大小
- 头大小+初始化长度+1 = 要申请的内存空间
- memset 用0初始化整个结构体*sh
- 初始化 指针,len已使用长度 ,alloc 申请长度 这些信息
- memcpy(s, init, initlen)方法,将*init(真正的字符串)复制到sds的buff[]中
- 在末尾加上\0结束符
sds sdsnewlen(const void *init, size_t initlen) {
void *sh;
sds s;
char type = sdsReqType(initlen);
if (type == SDS_TYPE_5 && initlen == 0) type = SDS_TYPE_8;
int hdrlen = sdsHdrSize(type);
unsigned char *fp;
sh = s_malloc(hdrlen+initlen+1);
if (init==SDS_NOINIT)
init = NULL;
else if (!init)
memset(sh, 0, hdrlen+initlen+1);
if (sh == NULL) return NULL;
s = (char*)sh+hdrlen;
fp = ((unsigned char*)s)-1;
switch(type) {
case SDS_TYPE_5: {
*fp = type | (initlen << SDS_TYPE_BITS);
break;
}
case SDS_TYPE_8: {
SDS_HDR_VAR(8,s);
sh->len = initlen;
sh->alloc = initlen;
*fp = type;
break;
}
case SDS_TYPE_16: {
SDS_HDR_VAR(16,s);
sh->len = initlen;
sh->alloc = initlen;
*fp = type;
break;
}
case SDS_TYPE_32: {
SDS_HDR_VAR(32,s);
sh->len = initlen;
sh->alloc = initlen;
*fp = type;
break;
}
case SDS_TYPE_64: {
SDS_HDR_VAR(64,s);
sh->len = initlen;
sh->alloc = initlen;
*fp = type;
break;
}
}
if (initlen && init)
memcpy(s, init, initlen);
s[initlen] = '\0';
return s;
}
|