1

我想定期从网站 http 获取一些价值。使用野兽,代码如下:

// Set up an HTTP GET request message
http::request<http::string_body> req{http::verb::get, target, version};
req.set(http::field::host, host);
req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
http::response<http::string_body> res;
while (true) {
    // Send the HTTP request to the remote host
    http::write(stream, req);
    
    res = {};
    // Receive the HTTP response
    http::read(stream, buffer, res);

    // Write the message to standard out
    std::cout << res << std::endl;
}

但在循环中,

res = {}

带来了一个临时对象的创建,一个移动/复制分配和临时对象的销毁。我想知道是否有更好的方法来避免这些不必要的成本。</p>

4

3 回答 3

0

只需删除有问题的行并在循环 res内移动声明即可。然后将在每次循环中创建和销毁:whileres

// Set up an HTTP GET request message
http::request<http::string_body> req{http::verb::get, target, version};
req.set(http::field::host, host);
req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);

while (true) {
    // Send the HTTP request to the remote host
    http::write(stream, req);
    
    // Receive the HTTP response
    http::response<http::string_body> res;
    http::read(stream, buffer, res);

    // Write the message to standard out
    std::cout << res << std::endl;
}
于 2020-09-11T08:13:17.593 回答
0

这就是我要做的

http::read(stream, buffer, res);
// move the response object to the processing function
process(std::move(res)); // res will be as clean as newly constructed after being moved
于 2022-01-04T03:05:28.440 回答
0

您可以替换res = {};res.clear();或完全删除它。

readfree 函数实例化一个解析器,该解析器拥有所有响应资源的所有权(通过移动)¹ 。在其构造函数中,它无论如何都会无条件地清除消息对象:

在此处输入图像描述

您可以使用调试器通过像这样的简单测试器跟踪这些行,这正是我所做的。


¹最后,消息被移回传递的响应对象中,因此可以解决

于 2020-09-11T13:02:30.230 回答