struct sdshdr
结构体中的最后一个 char buf[]
被称为 flexible array member
,在计算结构体大小的时候是不记入在内的,因此 sizeof(struct sdshdr)
实际上就是 sizeof(unsigned int) + sizeof(unsigned int)
这样就能理解了。
----------- |5|0|redis| ----------- ^ ^ sh sh->buf
所谓的 sizeof(struct sdshdr)
实际上是就是 len
和 free
所占的大小,因此用 sh->buf
的位置减去 sizeof(struct sdshdr)
就是 sh
的位置了,再经过 struct sdshdr *
转换,就可以得到 sds
对应的 struct sdshdr
结构体了。
参考资料:
本文出自:http://blog.sloger.info/, 原文地址:http://sloger.info/posts/convert-sds-to-sdshdr-with-sizeof-in-redis, 感谢原作者分享。