1

我继承了一些 boost::asio 代码,这些代码利用异步方法通过某些套接字读取/写入数据。目前,代码使用 boost::bind 的读/写处理程序来类成员函数,如下所示:

boost::asio::async_read(socket_, boost::asio::buffer(&in_data.header.packet_size, 1), boost::bind(&SocketIO::handle_read, shared_from_this(), boost::asio::placeholders::error);

我想使用 boost::function 更改代码以使用存储的绑定版本,但我不清楚这样做是否有任何优点或缺点。我认为不连续重新创建绑定会减少对象分配。但是,async_receive 的 boost 文档(在此处列出)声明“将根据需要对处理程序进行复制”。我不确定什么条件需要制作副本。

对此的任何见解将不胜感激。

4

1 回答 1

0

绑定实际上可以相当有效,因为它可以在不进入堆的情况下运行。它只是将您的变量和占位符复制到堆栈上的内部结构,然后返回。生成的类型非常复杂,但您通常不需要查看任何内容。

如果要将其存储在 a 中boost::function,则需要进行某种堆分配。这在理论上只会发生一次,但在这种情况下,这是不切实际的。

bind您调用的第二个参数是shared_from_this(). 这是确保您的对象在其所有处理程序被调用之前没有被销毁的好方法,因为 ASIO 将为您的对象保留一个 shared_ptr。问题是,如果要将结果存储bind在 a 中boost::function,您还将存储共享指针。这将导致您的对象始终存在一个 shared_ptr,从而防止正确销毁您的对象。

于 2013-09-26T13:19:37.950 回答