boost :: asio自定义处理程序分配

时间:2014-01-19 19:41:04

标签: c++ memory-management boost-asio

我刚刚尝试了解boost :: asio处理程序分配示例(http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/example/allocation/server.cpp)。

我知道这是一个用于教育目的的过于简单的示例,但有一些我无法理解的东西:是否有任何情况下,类handler_allocator使用堆(in_use_ == true)因为我看不到它。

每个会话都有自己的分配器,每次都是这样的:读取然后写入,但在写入完成之前不会读取。您也可以阅读文档:

  

实现保证在调用关联的处理程序之前将释放释放,这意味着内存已准备好重用于处理程序启动的任何新的异步操作。

我的问题是:你能告诉我一个例子,堆上的分配(在这个例子中)发生了吗?

额外:任何人都能说明一个更完整的处理程序自定义分配示例吗?

1 个答案:

答案 0 :(得分:4)

简而言之,Boost.Asio不保证asio_handler_allocate()只能为一次异步操作调用一次。因此,在示例中,如果Boost.Asio决定它需要额外的存储,handler_allocator将通过运营商new()从免费商店分配。 Asynchronous Operations文档声明:

  

如果实现需要为异步操作分配存储,则实现将执行asio_handler_allocate(size, &h),[...]。可以为单个异步操作分配多个存储块。

未指定实现用于确定它需要分配存储的标准。另外,asio_handler_*()功能的要求可以在Handler文档中找到。

对于以前版本的Boost.Asio,该示例可能已经为每个异步操作执行了多次分配。对revision history的简要介绍表明已经花费了大量精力来减少处理程序副本的数量。