std :: string与byte缓冲区(c ++中的差异)

时间:2017-05-24 18:38:25

标签: c++ arrays string bytebuffer

我有一个项目,我使用boost.asio套接字在客户端和服务器之间传输数据。一旦连接的一端接收到数据,它就会将其转换为std::vector std::string,然后通过先前定义的“回调”函数将其传递给数据的实际接收对象。这种方式到目前为止工作正常,只是,我现在使用atoi()to_string等方法将其他数据类型转换为可发送格式并返回。这种方法在网络使用方面当然有点浪费(特别是在传输大量数据而不仅仅是单个整数和浮点数时)。因此,我想序列化和反序列化数据。因为有效地,任何序列化方法都会产生字节数组或缓冲区,所以我只需使用std::string就可以了。这样做有什么不利之处吗?我不明白为什么应该有一次,因为字符串应该只是字节数组。

4 个答案:

答案 0 :(得分:4)

在功能方面,没有真正的区别。

出于性能原因和代码清晰度的原因,我建议使用std::vector<uint8_t>,因为它使得维护代码的任何人都更清楚它是一个字节序列,而不是字符串。 / p>

答案 1 :(得分:3)

使用字符串时应使用std::string,使用二进制blob时最好使用std::vector<uint8_t>。有很多好处:

  • 您的意图很明确,因此代码不易出错

  • 您不会将二进制缓冲区作为字符串传递给错误预期std::string的函数

  • 您可以覆盖此类型的std::ostream<<()以正确格式打印blob(通常是十六进制转储)。您不希望将二进制blob打印为字符串。

可能会有更多。只有std::string的好处,我才能看到你不需要做typedef。

答案 2 :(得分:1)

你是对的。字符串只不过是字节数组。 std::string只是管理表示字符串的缓冲区数组的便捷方式。就是这样!

使用std::string没有任何缺点,除非你正在开展一些非常真实的关键性能,例如内核......然后使用std::string会产生相当大的开销。除此之外,请随意使用它。

-

幕后的std::string需要对字符串的状态进行一系列检查,以确定它是否会使用小字符串优化。今天,几乎所有编译器都实现了小字符串优化。它们都使用不同的技术,但基本上它需要测试bitflags,它将告诉字符串是在堆栈还是堆中构造。如果直接使用char[],则不存在此开销。但是,除非你正在研究一些非常关键的东西,比如内核,否则你不会注意到任何事情,std::string更方便。

同样,这只是幕后发生的事情之一,只是作为展示它们差异的一个例子。

答案 3 :(得分:-2)

根据您发送网络消息的频率,std::string应该没问题。这是一个方便的类,可以为你处理很多char工作。如果要推送大量数据,可能需要直接使用char数组并将其转换为字节,这样可以最大限度地减少std::string带来的额外开销。

编辑:如果有人可以评论并指出你认为我的答案很糟糕的原因,那就太棒了,也帮助我学习。