Google的协议缓冲区使用C ++标准字符串类std::string
作为可变大小字节数组(see here),类似于Python,其中字符串类也用作字节数组(至少在Python 3.0之前)。
这种做法似乎很好:
assign
快速分配,vector<byte>
快速直接访问byte*
不允许static_cast
不同,它允许更容易的内存管理和const引用。但我很好奇:这是C ++中字节数组的首选方式吗?这种方法的缺点是什么(超过几个{{1}} s)
答案 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
:
std::swap
我个人使用std::vector
表示可变大小的数组,boost::array
表示静态大小的数组。
答案 2 :(得分:2)
我“认为”使用std::vector
是一种更好的方法,因为它旨在用作数组。确实,所有实现(我知道和听说过)都将字符串“元素”存储在连续的内存中,但这并不能使其成为标准。即使用std::string
的代码就像字节数组一样,它假定元素是连续的,而不必按照标准。