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

标签 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) 的任何情况,因为我看不到它。

每个 session 都有自己的分配器,每次都是这样:读取然后写入,但直到写入完成后才能读取。您还可以阅读文档:

The implementation guarantees that the deallocation will occur before the associated handler is invoked, which means the memory is ready to be reused for any new asynchronous operations started by the handler.

我的问题是:您能告诉我一个发生堆分配(在此示例中)的示例吗?

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

最佳答案

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

If the implementation needs to allocate storage for an asynchronous operation, the implementation will perform asio_handler_allocate(size, &h), [...]. Multiple storage blocks may be allocated for a single asynchronous operation.

实现用于确定它需要分配存储的标准是未指定的。可以在 Handler 中找到对 asio_handler_*() 函数的额外要求文档。

对于以前版本的 Boost.Asio,该示例可能在每个异步操作中执行了多次分配。简要浏览 revision history表示已努力减少处理程序拷贝的数量。

关于c++ - boost::asio 自定义处理程序分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21221670/

相关文章:

c++ - 如何修复由生成随机枚举值引起的堆栈损坏?

boost - c++0x lambdas,不让我作为函数 ptr 传递

c++ - boost::asio::ssl 多线程应用程序访问冲突

C++,从函数返回字符串; boost::asio 读/写

objective-c - 让成员变量保留而不是分配是更好的做法吗

python - 如何使用 swig 修改类构造函数以保留对构造函数参数之一的引用?

c++ - 表示 vector 引用 vector 的最方便的方法

c++ - 不按回车进入下一条指令

objective-c - weak 和 __unsafe_unretained 之间的区别

c++ - 尝试链接 .cpp 文件时出现多重定义错误(头文件中没有 .cpp)