【发布时间】:2011-03-09 15:49:24
【问题描述】:
boost::asio 的各种read 和write 函数和方法接受boost::asio::buffer。根据buffer's documentation,可变的std::string 不能包装在boost::asio::buffer 中,因此不能用于asio 的read 函数。这可能是因为std::string 不允许对其内部缓冲区进行可变访问(这在之前here 中讨论过)。
这很遗憾,因为std::string 是一种在 C++ 中表示可变数据缓冲区的便捷方式。没有它,我们要么只剩下 POD 阵列,boost::array 和 std::vector<char>。前两个对于可变长度消息不方便。 std::vector<char> 可以工作,但在 (*) 周围携带数据缓冲区是一种不自然的方式
问题:
- 对于读取缓冲区,
std::string和boost::asio是否有其他替代方案?我在这里遗漏了什么吗? - 我想知道为什么
std::vector<char>在可变缓冲区中被支持。是因为它保证其内部缓冲区在内存中是连续的,并允许使用&vec[0]对其进行可变访问吗?
提前致谢
(*) 恕我直言。以protobuf 序列化为例 - 它提供序列化为std::string,但不提供序列化为std::vector<char>,至少不明确。
编辑:我最终还是使用了vector<char>。 protobuf 允许通过带有指针的SerializeToArray 调用序列化为vector<char>(&vec[0] 可以在那里传递)。
【问题讨论】:
-
我通常使用
vector<char>- 因为我发现在所有情况下处理接收到的数据的操作都更快。但是我也看到了asio::streambuf的用法:boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/…。 -
@Nim:我考虑过
asio::streambuf,但它对于固定大小的读取似乎有问题,并且更适合read_until就像在HTTP 中一样。但我可能会遗漏一些东西...... -
@Eli:我一直发现
std::vector<unsigned char>是表达字节缓冲区的自然方式。char的未知签名很烦人......从语义上讲,string并没有真正的意义。不要忘记protobuf建议序列化为纯文本,在这种情况下string确实看起来很自然。 -
@Mattieu M.:我不认为
protobuf建议序列化为纯文本,它的序列化输出肯定看起来像二进制数据(不是ascii) -
@Eli 我不确定您所说的
asio::streambuf对固定大小的读取有问题是什么意思。我已经在几个项目中成功使用它,它与 Boost.Serialization 很好地集成在一起。您能否编辑您的问题以澄清您的疑虑?
标签: c++ boost-asio