我刚刚尝试了解boost :: asio处理程序分配示例(http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/example/allocation/server.cpp)。
我知道这是一个用于教育目的的过于简单的示例,但有一些我无法理解的东西:是否有任何情况下,类handler_allocator使用堆(in_use_ == true)因为我看不到它。
每个会话都有自己的分配器,每次都是这样的:读取然后写入,但在写入完成之前不会读取。您也可以阅读文档:
实现保证在调用关联的处理程序之前将释放释放,这意味着内存已准备好重用于处理程序启动的任何新的异步操作。
我的问题是:你能告诉我一个例子,堆上的分配(在这个例子中)发生了吗?
额外:任何人都能说明一个更完整的处理程序自定义分配示例吗?
答案 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的简要介绍表明已经花费了大量精力来减少处理程序副本的数量。