asio中大量使用handler, 几乎所有的异步函数都带有handler参数. 在调用这些函数时, asio会分配一片内存保存这个handler, 以便在异步完成时调用这个handler. 而这些handler大小往往很小, 因为里面只有几个参数.
以下代码来自boost_1_45/libs/asio/example/allocation/server.cpp
首先需要实现一个类模板custom_alloc_handler, 该类模板允许handler对象使用自定义的内存分配器. custom_alloc_handler需要实现operator(), asio_handler_allocate 和 asio_handler_deallocate 模板函数.
- template <typename Handler>
-
class custom_alloc_handler
-
{
-
public:
-
custom_alloc_handler(handler_allocator& a, Handler h): allocator_(a), handler_(h)
-
{
- }
-
-
template <typename Arg1>
-
void operator()(Arg1 arg1)
- {
-
handler_(arg1);
-
}
-
-
template <typename Arg1, typename Arg2>
-
void operator()(Arg1 arg1, Arg2 arg2)
- {
-
handler_(arg1, arg2);
-
}
-
-
friend void* asio_handler_allocate(std::size_t size,
-
custom_alloc_handler<Handler>* this_handler)
-
{
-
return this_handler->allocator_.allocate(size);
-
}
-
-
friend void asio_handler_deallocate(void* pointer, std::size_t /*size*/,
-
custom_alloc_handler<Handler>* this_handler)
- {
-
this_handler->allocator_.deallocate(pointer);
-
}
-
-
private:
-
handler_allocator& allocator_; // 自定义的内存分配器
-
Handler handler_;
-
};
然后实现一个模板函数
template <typename Handler
>-
inline custom_alloc_handler<Handler> make_custom_alloc_handler(
-
handler_allocator& a, Handler h)
-
{
-
return custom_alloc_handler<Handler>(a, h);
-
}
这样, 在调用asio中异步函数的时候, 大多数情况下就是输入boost::bind()的地方, 修改为
- make_custom_alloc_handler(allocator_, boost::bind(...));
后话:
其实实现这段代码的必要性并不是很大, 反复调用的时候诚然会有很多小块的内存, 但是实际应用中, stl的list, map, vector 等以及相关迭代器的应用同样会带来一样的问题, 如果每次都这样定义std:list
list; 我想你肯定会头痛, 何况内存池很可能是后期为了优化才加进去的.
因此在此建议项目前期直接new/delete就行了, 等到系统稳定, 可以考虑使用google的内存池的解决方案 google-perftools:
阅读(2651) | 评论(0) | 转发(1) |