将streambuf提升为const char*,使用buffer_cast vs std::string vs ost
Boost streambuf to const char* with buffer_cast vs std::string vs ostringstream
我有一个客户端/服务器应用程序,使用boost::read_until和boost::streambuf。我正在从套接字读取XML消息,并希望使用tinyXML2对其进行解析,如下所示:
XMLDocument doc;
doc.parse(strPtr); // strPtr is const char*
我需要从streambuf中提取const char *strPtr。到目前为止,我在堆栈交换中找到了三个方法:
// method 1, string constructor
const char * streambufToPtr(boost::asio::streambuf &message) {
boost::asio::streambuf::const_buffers_type bufs = message.data();
std::string astr(boost::asio::buffers_begin(bufs), boost::asio::buffers_begin(bufs) + message.size());
return astr.c_str();
}
// method 2, stringstream
const char * streambufToPtr(boost::asio::streambuf &message) {
std::ostringstream ss;
ss << &message;
std::string astr = ss.str();
return astr.c_str();
}
// method 3, buffer_cast
const char * streambufToPtr(boost::asio::streambuf &message) {
const char* bufPtr=boost::asio::buffer_cast<const char*>(message.data());
return bufPtr;
}
这三个方法在我的代码中都可以工作(到目前为止)。方法1和方法2可能至少复制一次(或多次)数据,而方法3则执行其他操作。
每个方法中发生了什么?相比之下,它们的速度有多快?在缓冲区溢出、线程或以后使用网络客户机/服务器应用程序时可能遇到的其他陷阱方面,这些方法是否不安全?
每个方法中发生了什么?
第一个方法将字节复制到std::string
中,并返回指向底层char
数组的指针。这将导致未定义的行为,因为当函数返回时字符串将被销毁,因此不要使用它。
第二种方法首先将字节复制到ostringstream
,然后复制到字符串(ss.str();
),然后再复制到另一个字符串(std::string astr =
,尽管编译器可能会省略最后一个副本)。它还返回一个指针,该指针在函数返回时将不再存在,因此不要使用它。
您的最后一个函数只是返回指向缓冲区底层字节的指针,并且是三个函数中唯一具有良好定义行为的函数(假设您的streambuf
比传递给tinyXML2的char
指针寿命更长,并且在此期间未被修改)。
相比之下它们有多快?这些有不安全的吗缓冲区溢出、线程或以后可能遇到的其他陷阱网络客户机/服务器应用程序?
这两个函数是没有意义的,因为其他两个函数是无用的。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何理解C++标准N3337中的expr.const.cast子句8
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- C++Cast运算符过载
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- Shared_ptr cast vs static_cast speed