【问题标题】:binary buffers for communication, c++用于通信的二进制缓冲区,C++
【发布时间】:2011-08-05 07:21:25
【问题描述】:

如果我需要一个二进制缓冲区对象,
就像用于 TCP/UDP 通信的一样,
在 c++ 中,我将基于什么?

  • vector<unsigned char> ?

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

  • new char[] ?

  • malloc()?

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

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

谢谢

【问题讨论】:

  • 我怀疑答案将取决于您要使用缓冲区的目的以及您希望如何使用它。
  • Boost Asio 使用/推荐 char 向量来存储二进制数据。所以我认为它不应该带来任何性能问题

标签: c++ winapi stl memory-management malloc


【解决方案1】:

二进制缓冲区可以看作是您为存储一些非结构化信息而保留的一块内存。 从这个意义上说,使用 new char[]malloc 是完全等价的,IMO,因为它们给你一块内存和一个指向它的指针。

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

&vect[0]

要像使用malloc 那样访问底层缓冲区,它有它的优点,比如缓冲区可扩展性和比直接指针更高的访问安全性;您可能会阅读discussion here。我自己在一个项目中使用过它们。

std::strings 原则上存在 C++ (98, 03) 标准不保证底层缓冲区连续性的问题,但这似乎不是编译器实现的问题。 C++0x 似乎具有标准化的缓冲区连续性(但我没有专门搜索过)。所以你也可以使用它们,但是在Herb Sutter's comment here之前阅读(它不在正文中,而是在它末尾发布的第三条评论中)。

无论如何,在std::stringstd::vector 之间,我会选择std::vector

【讨论】:

    【解决方案2】:

    newmalloc 之间的区别在于 new 还为它分配内存的实体调用构造函数(如果有的话)。但是由于 char 是使用 newmalloc 的基本类型,所以没有区别,因为 char 没有构造函数。 deletefree 也是如此。

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

    char* buf = new char[100];
    

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

    delete[] buf;
    

    删除数组otherwise you will have memory leaks

    不会亲自使用std::stringstd::vector,因为:

    • 一个简单的 char 数组对我来说似乎更快
    • 更“通用”(std 有多种实现,但字节数组始终相同)
    • 而且可能更容易理解和调试

    HTH,
    JP

    【讨论】:

    • 要挑剔,你可以值构造整数类型及其数组(默认为0),所以new char[100]()应该给你一个清零数组。不过,目前对此的支持可能会有所不同。还要注意new是一个表达式,而malloc()是一个函数
    • 你关于它更快的观点是有争议的。速度差异最多可以忽略不计,并且您可以获得更好的资源范围和类型安全性。我认为处理数组的认知负担不值得速度“增益”(如果有的话)。
    • @Pablo:我想既然 std::string 附加了逻辑,它一定会更慢
    【解决方案3】:

    这取决于您的程序如何工作。是客户端还是服务器?会发送/接收固定长度的请求吗?以后需要修改数据吗?是否要作为字符串进行操作?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2014-09-01
      • 2013-03-05
      • 2021-07-24
      • 2019-06-04
      相关资源
      最近更新 更多