C++ 用于通信的二进制缓冲区,c++;

C++ 用于通信的二进制缓冲区,c++;,c++,winapi,stl,memory-management,malloc,C++,Winapi,Stl,Memory Management,Malloc,如果我需要一个二进制缓冲区对象, 与用于TCP/UDP通信的类似, 什么是我的基础,在C++ + < /P> 向量 std::string?——string可以保存0字节,这与流行的观点相反,所以它可以用来保存二进制数据 新字符[] malloc() 有人看到用于二进制缓冲区的std::vector吗? 我没看见。为什么?表演 我确实看到malloc()经常用于二进制缓冲区。 在C++中。有人能证实吗?解释一下 多亏了二进制缓冲区可以看作是一块内存,用于存储一些非结构化信息。 在这个意义上,

如果我需要一个二进制缓冲区对象,
与用于TCP/UDP通信的类似,
什么是我的基础,在C++ + < /P>
  • 向量

  • std::string
    ?——string可以保存0字节,这与流行的观点相反,所以它可以用来保存二进制数据

  • 新字符[]

  • malloc()

有人看到用于二进制缓冲区的std::vector吗?
我没看见。为什么?表演

我确实看到malloc()经常用于二进制缓冲区。
在C++中。有人能证实吗?解释一下


多亏了

二进制缓冲区可以看作是一块内存,用于存储一些非结构化信息。 在这个意义上,使用new
char[]
malloc
是完全等效的,IMO,因为它们为您提供了一块内存和指向它的指针

使用std::vector是另一回事;除了成本之外,我认为这与成本无关,因为您将使用

&vect[0]
要像使用
malloc
一样访问底层缓冲区,它有其优点,比如缓冲区可扩展性和比直接指针更高的访问安全性;你可以看看报纸。我自己也在一个项目中使用过它们

<>代码> STD::String s原则上存在C++(98, 03)标准不能保证底层缓冲区的连续性的问题,但这似乎不是编译器实现的问题。C++0x似乎具有标准化的缓冲区连续性(但我没有专门搜索)。因此,您也可以使用它们,但请先阅读(它不在文章主体中,而是在文章末尾的第三条评论中)


无论如何,在
std::string
std::vector
之间,我会选择
std::vector
,这取决于程序的工作方式。是客户端还是服务器?是否发送/接收固定长度请求?以后是否需要修改数据?是否要将其作为字符串进行操作


我会使用std::string,因为它在这方面最灵活。但是正如您所看到的,它不是最优的。

new和
malloc
之间的区别在于new还为它分配内存的实体调用构造函数(如果有)。但是由于char是一种基本类型,所以使用
new
malloc
没有区别,因为char没有构造函数。关于
删除
免费
也可以这样说

我个人会使用char*缓冲区(char是内存中的1字节):

另外,请记住,在释放分配的缓冲区时,请使用以下结构:

delete[] buf;
删除数组

我个人不会使用
std::string
std::vector
,因为:

  • 简单的字符数组对我来说似乎更快
  • 更“通用”(std有几种实现,但字节数组总是相同的)
  • 而且它可能更容易理解和调试
HTH,

JP

我怀疑答案将取决于您想使用缓冲区做什么以及如何使用它。Boost Asio使用/推荐字符向量来存储二进制数据。因此,我认为它不应该给出任何性能问题来挑剔,您可以对整型类型及其数组进行赋值构造(默认为0),因此
newchar[100]()
应该为您提供一个清零数组。不过,目前对此的支持程度可能有所不同。还要注意的是,
new
是一个表达式,而
malloc()
是一个函数。您关于它更快的观点值得商榷。速度差异最多可以忽略不计,您可以获得更好的资源范围和类型安全性。我认为处理数组的认知负担不值得速度“提高”(如果有的话)。@Pablo:我想既然std::string附加了逻辑,那么它一定会慢一些
delete[] buf;