将streambuf提升为const char*,使用buffer_cast vs std::string vs ost

Boost streambuf to const char* with buffer_cast vs std::string vs ostringstream

本文关键字:vs cast buffer std ost string 使用 streambuf const char      更新时间:2023-10-16

我有一个客户端/服务器应用程序,使用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指针寿命更长,并且在此期间未被修改)。

相比之下它们有多快?这些有不安全的吗缓冲区溢出、线程或以后可能遇到的其他陷阱网络客户机/服务器应用程序?

这两个函数是没有意义的,因为其他两个函数是无用的。