我继承了一些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更改代码以使用存储的bind版本,但我不清楚这样做是否有任何优点或缺点。我认为不再连续重新创建绑定会减少对象分配。但是,async_receive(Listed Here)的boost文档指出“Copies将根据需要由处理程序组成”。我不确定需要制作副本的条件是什么。
对此有任何见解将不胜感激。
答案 0 :(得分:0)
绑定实际上可以相当高效,因为它可以在不进入堆的情况下运行。它只是将变量和占位符复制到堆栈的内部结构中,然后返回它。结果类型非常复杂,但通常不需要看到任何类型。
如果要将其存储在boost::function
中,则需要进行某种堆分配。理论上这只会发生一次,但在这种情况下,这是不切实际的。
bind
来电的第二个参数是shared_from_this()
。这是确保在调用所有处理程序之前不会销毁对象的好方法,因为ASIO会将shared_ptr保留到对象中。问题是如果您要将bind
的结果存储在boost::function
中,您还会存储共享指针。这将导致对象始终存在shared_ptr,从而阻止对象的正确销毁。