LevelDB源码EncodeVarint32

Citron__ 2017-12-15 01:49:17
这两天在看LevelDB的源代码。
发现大牛写了一个变长编码int的函数,源代码如下:

unsigned char * EncodeVarint32(unsigned char *dst, unsigned int v){
unsigned char *ptr = reinterpret_cast<unsigned char *>(dst);
static int B = 128;
if (v < (1 << 7)){
*(ptr++) = v;
}
else if (v < (1 << 14)){
*(ptr++) = v | B;
*(ptr++) = v >> 7;

}
else if (v<(1<<21)) {
*(ptr++) = v | B;
*(ptr++) = (v >> 7) | B;
*(ptr++) = v >> 14;
}
else if (v < (1 << 28)) {
*(ptr++) = v | B;
*(ptr++) = (v >> 7) | B;
*(ptr++) = (v >> 14) | B;
*(ptr++) = v >> 21;
}
else {
*(ptr++) = v | B;
*(ptr++) = (v >> 7) | B;
*(ptr++) = (v >> 14) | B;
*(ptr++) = (v >> 21) | B;
*(ptr++) = v >> 28;
}
return reinterpret_cast<unsigned char *>(ptr);

}

大概能看懂什么意思,但是有个疑问的是,最后返回的结果是ptr,
而ptr在各种操作中一直在进行自增长操作(ptr++)
也就是说刚开始ptr是指向一个数组的开头,到结束ptr是指向数组的结尾。。。
那这样返回的ptr,,,还有什么作用呢,再--减回去么?
...全文
255 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2017-12-15
  • 打赏
  • 举报
回复
引用 1 楼 Citron__ 的回复:
好吧,仔细想了下,最后被使用的是dst指针,反回的是指向dst的结尾的指针,,,
没必要返回dst,因为调用者是已知的
paschen 版主 2017-12-15
  • 打赏
  • 举报
回复
具体你需要看他代码思路,可能就返回结束的位置,以便于继续写其他数据
Citron__ 2017-12-15
  • 打赏
  • 举报
回复
好吧,仔细想了下,最后被使用的是dst指针,反回的是指向dst的结尾的指针,,,

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧