一般来说,在C++中存储二进制数据的最佳方法是什么?据我所知,这些选项很大程度上归结为使用字符串或向量
通常我只是使用一个字符串,但是我不确定是否存在我缺少的开销,或者STL在内部进行的转换可能会破坏二进制数据的完整性.有没有人对此有任何指针(har)?这样或那样的建议或偏好?
char的向量很好,因为内存是连续的.因此,您可以将它与许多C API一起使用,例如berkley套接字或文件API.您可以执行以下操作,例如:
std::vectorvect; ... send(sock, &vect[0], vect.size());
它会工作正常.
您可以像处理任何其他动态分配的char缓冲区一样处理它.您可以上下扫描寻找神奇的数字或图案.您可以部分解析它.要从套接字接收,您可以非常轻松地调整它以附加更多数据.
缺点是调整大小并不是非常有效(谨慎调整大小或预先分配),并且从数组前面删除也将非常缺乏.例如,如果您需要经常在数据结构前面一次只弹出一个或两个字符,则可以选择在此处理之前复制到双端队列.这会使您复制并且双端队列内存不是连续的,因此您不能只是将指针传递给C API.
最重要的是,在潜入之前了解数据结构及其权衡,但是char的向量通常是我在一般实践中使用的.
std :: string的最大问题是当前标准不保证其底层存储是连续的.但是,没有已知的STL实现,其中string不是连续的,因此在实践中它可能不会失败.事实上,新的C++ 0x标准将通过强制std :: string使用连续缓冲区(例如std :: vector)来解决此问题.
另一个反对字符串的参数是它的名字表明它包含一个字符串,而不是一个二进制缓冲区,这可能会引起混淆读取代码的人.
也就是说,我也建议使用矢量.
我std::string
也是这样用的,从来没有遇到过问题.
一个"指针",我刚刚在昨天的一段代码中收到了一个尖锐的提醒:当从二进制数据块创建一个字符串时,使用std::string(startIter, endIter)
构造函数形式,而不是std::string(ptr, offset, length)
形式 - 后者假设指针指向到C风格的字符串,并在第一个零字符后忽略任何内容(它复制"最多"指定的字符串,而length
不是length
字符).