我有一个项目,我使用boost.asio套接字在客户端和服务器之间传输数据。一旦连接的一端接收到数据,它就会将其转换为std::vector
std::string
,然后通过先前定义的“回调”函数将其传递给数据的实际接收对象。这种方式到目前为止工作正常,只是,我现在使用atoi()
和to_string
等方法将其他数据类型转换为可发送格式并返回。这种方法在网络使用方面当然有点浪费(特别是在传输大量数据而不仅仅是单个整数和浮点数时)。因此,我想序列化和反序列化数据。因为有效地,任何序列化方法都会产生字节数组或缓冲区,所以我只需使用std::string
就可以了。这样做有什么不利之处吗?我不明白为什么应该有一次,因为字符串应该只是字节数组。
答案 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
带来的额外开销。
编辑:如果有人可以评论并指出你认为我的答案很糟糕的原因,那就太棒了,也帮助我学习。