Pub*_*bby 5 c++ boost boost-asio
在ASIO HTTP Server 3示例中,有如下代码:
void server::start_accept()
{
new_connection_.reset(new connection(io_service_, request_handler_));
acceptor_.async_accept(new_connection_->socket(),
boost::bind(&server::handle_accept, this,
boost::asio::placeholders::error));
}
void server::handle_accept(const boost::system::error_code& e)
{
if (!e)
{
new_connection_->start();
}
start_accept();
}
Run Code Online (Sandbox Code Playgroud)
从本质上讲,new_connection_是的构件server类和用于传递从一个连接start_accept到handle_accept.现在,我很好奇为什么new_connection_实现为成员变量.
使用bind而不是使用成员变量来传递连接是否也有效?像这样:
void server::start_accept()
{
std::shared_ptr<connection> new_connection(new connection(io_service_, request_handler_));
acceptor_.async_accept(new_connection_->socket(),
boost::bind(&server::handle_accept, this,
boost::asio::placeholders::error),
new_connection);
}
void server::handle_accept(boost::system::error_code const& error, std::shared_ptr<connection> new_connection)
{
if (!error) {
new_connection->start();
}
start_accept();
}
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么该示例使用成员变量?是否避免涉及复制?
(注意:我对ASIO不满意,所以这里可能存在一个根本的误解)
在使用创建的函数内传递套接字变量std::bind或多或少与将其保留为http::server3::server类中的成员变量相同。使用bind将创建临时变量,而使用成员变量则不会。我认为这不是一个大问题,因为std::shared_ptr复制的成本并不是非常昂贵,示例中的代码路径也不是性能关键部分。
在编写自己的应用程序时,我发现自己同时使用了这两种技术。如果异步调用链很长,我通常会保留变量作为成员,以简化处理程序的函数签名并防止代码重复。对于较短的调用链,将状态变量保留在从绑定创建的仿函数中更容易理解代码的逻辑。
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |