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

Chr*_*son 0 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)。

每个会话都有自己的分配器,每次都是这样的:先读取再写入,但是直到写入完成才读。您也可以阅读文档:

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

我的问题是:您能告诉我一个示例,在该示例中堆发生分配的地方吗?

额外:现在有没有人提供处理程序自定义分配的更完整示例?

Tan*_*ury 5

简而言之,Boost.Asio不保证asio_handler_allocate()仅对单个异步操作调用一次。因此,在示例中,如果Boost.Asio决定需要额外的存储空间,handler_allocator它将通过运算符从免费存储空间进行分配new()。在异步操作文档状态:

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

未指定实现用来确定其需要分配存储的标准。有关其他asio_handler_*()功能要求,请参见处理程序文档。

使用Boost.Asio的早期版本,该示例可能已为每个异步操作执行了多次分配。简要浏览一下修订历史记录,表明已花费了大量精力来减少处理程序副本的数量。