C++ 与使用boost::asio的boost::bind相比,使用存储的boost::function有哪些优点或缺点?

C++ 与使用boost::asio的boost::bind相比,使用存储的boost::function有哪些优点或缺点?,c++,boost,boost-asio,C++,Boost,Boost Asio,我继承了一些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::placeho

我继承了一些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的存储版本,但我不清楚这样做是否有任何优点或缺点。我认为不连续地重新创建绑定会减少对象分配。但是,异步_接收状态的boost文档将根据需要对处理程序进行复制。我不确定在什么条件下需要复制或不复制


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

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

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


bind调用的第二个参数是this中的shared。这是一种很好的方法,可以确保在调用对象的所有处理程序之前不会销毁对象,因为ASIO将保留对象的共享ptr。问题是,如果要将bind的结果存储在boost::函数中,还需要存储共享指针。这会导致对对象总是有一个SysDypPTR,防止对对象进行适当的破坏。此外,在执行类型擦除以减少创建的函子数量时可能需要谨慎,因为这会阻止Boost.Asio调用正确的Asio_处理程序_*钩子。boost::bind应该没有问题,但它会影响从strand.wrap返回的处理程序。我认为它未指定导致复制处理程序的条件。当移动语义不可用时,将在Boost.Asio中的几个位置进行复制。当move语义可用,并且处理程序不是右值时,我相信会创建一个副本,然后在Boost.Asio中移动。