【问题标题】:What are the advantages or disadvantages to using a stored boost::function vs boost::bind with boost::asio?使用存储的 boost::function 与 boost::bind 和 boost::asio 的优缺点是什么?
【发布时间】:2013-09-26 12:43:19
【问题描述】:

我继承了一些 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 (Listed Here) 的 boost 文档指出“将根据需要对处理程序进行复制”。我不确定什么条件需要制作副本。

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

【问题讨论】:

  • 我相信它没有指定将导致处理程序被复制的条件。当移动语义不可用时,将在 Boost.Asio 中的几个位置进行复制。当移动语义可用并且处理程序不是rvalue 时,我相信会制作一个副本,然后在 Boost.Asio 中移动。

标签: c++ boost boost-asio


【解决方案1】:

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

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

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

【讨论】:

  • 要考虑的一点是argument copies made by boost::function 的数量。此外,在执行类型擦除时可能需要谨慎,以减少创建的仿函数的数量,因为它会阻止 Boost.Asio 调用正确的 asio_handler_* 钩子。这应该不是boost::bind() 的问题,但它会影响从strand.wrap() 返回的处理程序。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2016-03-16
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多