前面遇到的it->key()
和it->value()
调用的返回值就是leveldb::Slice
类型的实例。Slice
是一个简单的结构,它包含了一个length
和一个指向外部字节数组的指针。返回Slice
类型要比返回std::string
类型的开销小得多,因为这样我们就不需要对那些比较大的键值进行拷贝了。此外,leveldb
方法不返回以nul
结尾的C风格字符串,因为leveldb
的键和值允许包含\0
字符。
C++字符串和C风格字符串能够很容易的转换为Slice
类型:
leveldb::Slice s1 = "hello";
std::string str("world");
leveldb::Slice s2 = str;
一个Slice
类型也很容易的就能转换回C++字符串:
std::string str = s1.ToString();
assert(str == std::string("hello"));
在使用Slice
类型时要格外小心,因为它依赖调用者来保证Slice
指向的外部字符数组有效。比如下面这个例子就是有问题的:
leveldb::Slice slice;
if (...) {
std::string str = ...;
slice = str;
}
Use(slice);
因为if
语句块是有作用域的,所以当if
语句执行完后str
将会被析构,此时slice
指向的空间就不存在了。