LevelDB 整体代码还是比较好懂,没有用很多 C++奇淫技巧。不过还是有部分实现,相当比较少见,比如柔性数组、链接符号导出、Pimpl 类设计等。本文会梳理这里的 C++ 高级技巧,帮助更好地理解 LevelDB 的实现。柔性数组在util/cache.cc的 LRUHandle 结构体定义中,有一个柔性数组(flexible array member)char key_data[1],用来在 C/C++ 中实现可变长数据结构。123456789structLRUHandle{// ...charkey_data[1];// Beginning of keySlicekey()const{assert(next !=this);returnSlice(key_data, key_length);}};在这个 handle 结构体中,key_data[1]实际上只是一个占位符,真正分配给key_data的空间要比 1 字节大,它由 malloc 时计算的total_size确定。具体到 LevelDB 的实现中,在插入新的缓存条目时,会根据 key 的长度动态分配内存,然后将 key 的内容拷贝到这块内存中。如下代码:12345678910111213Cache::Handle*LRUCache::Insert(cons
...
继续阅读
(52)