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

std::string vs. byte buffer (difference in c++)

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

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

使用 std::string 没有任何缺点,除非您正在处理对性能非常关键的东西,例如内核……然后使用 std::string 会产生相当大的开销。除此之外,请随意使用它。

--

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

同样,这只是引擎盖下发生的事情之一,只是作为显示它们之间差异的示例。

根据您发送网络消息的频率,std::string 应该没问题。它很方便 class 可以为您处理很多 char 工作。如果你有很多数据要推送,那么直接使用 char 数组并将其转换为字节可能是值得的,只是为了尽量减少 std::string 的额外开销。

编辑:如果有人可以发表评论并指出您认为我的回答不好的原因,那就太好了,也可以帮助我学习。

就功能而言,没有真正的区别。

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

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

  • 你的意图很明确,所以代码不容易出错

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

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

可能还有更多。 std::string 的唯一好处是我可以看到您不需要执行 typedef。