Slice - LevelDB使用的数据结构

前面遇到的it->key()it->value()调用的返回值就是leveldb::Slice类型的实例。Slice是一个简单的结构,它包含了一个length和一个指向外部字节数组的指针。返回Slice类型要比返回std::string类型的开销小得多,因为这样我们就不需要对那些比较大的键值进行拷贝了。此外,leveldb方法不返回以nul结尾的C风格字符串,因为leveldb的键和值允许包含\0字符。

C++字符串和C风格字符串能够很容易的转换为Slice类型:

  1. leveldb::Slice s1 = "hello";
  2. std::string str("world");
  3. leveldb::Slice s2 = str;

一个Slice类型也很容易的就能转换回C++字符串:

  1. std::string str = s1.ToString();
  2. assert(str == std::string("hello"));

在使用Slice类型时要格外小心,因为它依赖调用者来保证Slice指向的外部字符数组有效。比如下面这个例子就是有问题的:

  1. leveldb::Slice slice;
  2. if (...) {
  3. std::string str = ...;
  4. slice = str;
  5. }
  6. Use(slice);

因为if语句块是有作用域的,所以当if语句执行完后str将会被析构,此时slice指向的空间就不存在了。