std::string 与字节缓冲区(c++ 中的差异)
std::string vs. byte buffer (difference in c++)
我有一个项目,我使用 boost.asio 套接字在客户端和服务器之间传输数据。一旦连接的一侧接收到数据,它将其转换为 std::string
的 std::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。
我有一个项目,我使用 boost.asio 套接字在客户端和服务器之间传输数据。一旦连接的一侧接收到数据,它将其转换为 std::string
的 std::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。