gpt4 book ai didi

c++ - 使用 buffer_cast vs std::string vs ostringstream 将 streambuf boost 为 const char*

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:43 25 4
gpt4 key购买 nike

我有一个使用 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 则执行其他操作。

每种方法的作用是什么?相比之下,它们有多快?就缓冲区溢出、线程或我以后可能在网络客户端/服务器应用程序中遇到的其他陷阱而言,这些是否更不安全?

最佳答案

What goes on in each of the methods?

第一种方法将字节复制到 std::string 中并返回指向底层 char 的指针大批。这会导致未定义的行为,因为当函数返回时字符串被销毁,请勿使用它。

第二种方法首先将字节复制到 ostringstream 中,然后是一个字符串(ss.str();),然后是另一个字符串(std::string astr =,尽管编译器可能会省略最后一个拷贝)。它还返回一个指针,指向函数返回时将不再存在的东西,不要使用它。

你的最终函数只是返回一个指向缓冲区底层字节的指针,并且是三个函数中唯一一个具有明确行为的函数(假设你的 streambuf 比你传递给 tinyXML2 的 char 指针长,并且不会同时修改)。

How fast are they in comparison? Is any of these unsafer in terms of buffer overflows, threading or other traps I might run into later with a network client/server application?

这些没有实际意义,因为其他两个函数没有用。

关于c++ - 使用 buffer_cast vs std::string vs ostringstream 将 streambuf boost 为 const char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24648173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com