std :: string作为C ++字节数组

时间:2010-01-10 13:41:09

标签: c++

Google的协议缓冲区使用C ++标准字符串类std::string作为可变大小字节数组(see here),类似于Python,其中字符串类也用作字节数组(至少在Python 3.0之前)。

这种做法似乎很好:

  • 允许通过assign快速分配,vector<byte>快速直接访问byte*不允许
  • 与使用static_cast不同,它允许更容易的内存管理和const引用。

但我很好奇:这是C ++中字节数组的首选方式吗?这种方法的缺点是什么(超过几个{{1}} s)

3 个答案:

答案 0 :(得分:8)

就个人而言,我更喜欢std::vector,因为std::string不能保证连续存储,std::string::data()不必是O(1)。 std::vector将在C ++ 0x中具有data成员函数。

答案 1 :(得分:3)

std::string可能有一个参考计数实现,这可能会或可能不是你正在写的优点/缺点 - 总是要小心。 std::string可能不是线程安全的。 std::string的潜在优势是易于连接,但是,使用STL也可以轻松实现这一点。

此外,使用boost::asio及其缓冲区对象时,与协议相关的所有问题都会消失。

至于std::vector

的缺点
  1. 快速分配可以通过std::swap
  2. 的技巧完成
  3. 可以通过&amp; arr [0]访问数据 - 保证向量(?)是连续的(至少所有实现都是如此)
  4. 我个人使用std::vector表示可变大小的数组,boost::array表示静态大小的数组。

答案 2 :(得分:2)

我“认为”使用std::vector是一种更好的方法,因为它旨在用作数组。确实,所有实现(我知道和听说过)都将字符串“元素”存储在连续的内存中,但这并不能使其成为标准。即使用std::string的代码就像字节数组一样,它假定元素是连续的,而不必按照标准。