如果我需要一个二进制缓冲区对象,
如用于TCP/UDP通信,
在c++中,我该基于什么呢?
-
vector<unsigned char>
? -
std::string
?——std::string可以保存0字节,与流行的看法相反,所以它可以用来保存二进制数据 -
new char[]
-
malloc()
有人看到std::vector被用于二进制缓冲区吗?
我没有看见。为什么?性能?
我确实看到malloc()经常用于二进制缓冲区。
在c++中。有人能证实吗?解释?
谢谢
二进制缓冲区可以看作是为存储一些非结构化信息而保留的一块内存。从这个意义上说,使用新的char[]
和malloc
是完全等价的,在我看来,它们给你一块内存和一个指向它的指针。
使用std::vector
是另一回事;除了成本,我认为这是无关紧要的,因为你将使用
&vect[0]
像malloc
那样访问底层缓冲区,它有它的优点,比如缓冲区的可扩展性和比直指针更安全的访问;你可以在这里阅读讨论。我自己也在一个项目中使用过它们。
std::string
在原则上存在c++(98,03)标准不保证底层缓冲区的连续性的问题,但这似乎不是编译器实现的问题。c++ 0x似乎有标准化的缓冲区连续性(但我没有专门搜索过)。所以你也可以使用它们,但请先阅读Herb Sutter的评论(它不在文章主体中,而是在文章末尾的第三条评论中)。
无论如何,在std::string
和std::vector
之间,我会选择std::vector
new
和malloc
之间的区别是new还调用它分配内存的实体的构造函数(如果有的话)。但是由于char是基本类型,使用new
或malloc
没有区别,因为char没有构造函数。delete
和free
也是如此。
我个人会使用char*缓冲区(一个char在内存中是1个字节):
char* buf = new char[100];
另外,请记住在释放已分配的缓冲区时,使用如下结构:
delete[] buf;
删除数组,否则会导致内存泄漏。
我个人不会使用std::string
或std::vector
,因为:
- 一个简单的char数组对我来说似乎更快
- 更"通用"(std有几种实现,但字节数组总是相同的)
- 可能更容易理解和调试
HTH,
摩根大通
这取决于你的程序如何工作。是客户机还是服务器?会发送/接收固定长度的请求吗?以后需要修改数据吗?你想作为一个字符串来操作吗?
我使用std::string,因为它在这方面是最灵活的。但是正如你所看到的,这并不是最优的。