5

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();
}

本质上,new_connection_server类的成员,用于将连接从 传递start_accepthandle_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();
}

如果是这样,为什么该示例使用成员变量?是为了避免涉及的复制吗?

(注意:我对 ASIO 还不满意,所以这里可能存在一个基本的误解)

4

1 回答 1

4

在创建的函数中传递套接字变量与std::bind将其保留为类中的成员变量或多或少相同http::server3::server。使用bind创建临时变量,而使用成员变量不会。我认为这不是一个大问题,因为std::shared_ptr复制成本并不高,示例中的代码路径也不是性能关键部分。

在编写自己的应用程序时,我发现自己同时使用了这两种技术。如果异步调用链很长,我通常会将变量保留为成员,以简化处理程序的函数签名并防止代码重复。对于较短的调用链,将状态变量保留在从 bind 创建的仿函数中更容易理解代码的逻辑。

于 2013-04-27T13:43:11.713 回答