精通LevelDB
上QQ阅读APP看书,第一时间看更新

2.1 string与Slice

string是C++中标准的数据类型,然而在LevelDB中需要创建一种基于string的新数据类型,即Slice。

Slice是LevelDB中的一种基本的、以字节为基础的数据存储单元,既可以存储key,也可以存储数据(data)。Slice对数据字节的大小没有限制,其内部采用一个const char*的常量指针存储数据,具有两个接口data()和size(),分别返回其表示的数据及数据的长度。

此外,为了进行key的比较(compare)操作,这里封装了Slice的比较模块,即==、!=,以及compare函数。

Slice是一种包含字节长度与指针(指定一个外部字节数组)的简单数据结构。

C++的string与Slice可以相互转换,参考Slice类的定义,如下所示:

class LEVELDB_EXPORT Slice {
 public:
  ...
  //通过构造函数,将一个string构造为一个Slice实例
  Slice(const std::string& s) : data_(s.data()), size_(s.size()) {}
  ...
  //Slice实例调用ToString方法会返回一个string
  std::string ToString() const { return std::string(data_, size_); }
  ...
};

上述代码中展示了如何将一个string和一个Slice实例相互转换。通过构造函数可以直接将一个string构造为Slice实例,Slice实例通过调用ToString方法又会返回一个string。

提示:为什么要使用Slice?

一般来讲,Slice作为函数的返回值。相比于C++的string类型,如果在返回时采用Slice类型,则只需要返回长度与指针,而不需要复制长度较长的key和value。此外,Slice不以' \0'作为字符的终止符,可以存储值为'\0'的数据。