源起
近来由于研究ACE
内存分配的组件,想做一个应用程序级的内存管理,有人还想自己写一个,我觉得可以直接用ACE
自己提供的内存管理器,避免重复发明轮子。
结合以前认识,和前辈们的积累,觉得可以记下来一些知识!
ACE Allocator体系
ACE_Stattic_Allocator<POOL_SIZE>
此静态内存分配器定内存大小,内部remove
接口为空实现,所以,分配器的内存在程序退出时依然可以保留,能够起到类似静态内存的效果。
此内存分配器体现为连续一整块内存,将会具有访问速度上的优势,以及可以避免内存碎片!
注意此类不具有锁策略,建议在线程安全的情况下使用,例如,利用线程变量或加锁
此类可以分配在静态内存区域,或堆上
在只申请内存、不释放内存,但是总量有限的场合将非常适用
ACE_Cached_Allocator和ACE_Dynamic_Cachee_Allocator
两个类都是定内存大小和定分配个数的内存管理池,它俩最大的区别就在于分配是具有字节概念,还是具有某个简单类型概念,分别可以提供内存池或简单对象池的服务。
考虑到内存池都不会设定无限大小,所以,这种内存池也非常有其使用的场合
具有可扩展的锁策略
对象归还分配器时,如果存在某些特殊的资源,需要释放,则依赖调用方主动编码
ACE_Allocator_Adapter< MALLOC >
此类可以整合变长、个数不定的内存池管理器ACE_Malloc成为Allocator分配器
ACE_Malloc和Allocator的重大区别
- Allocator
-
- Allocator两个
Cached
类基于定大小、定个数的内存池管理
- Allocator两个
-
- 其中静态分配器值得注意,在某些只申请不释放的场景,将连续内存具有访问优势
- ACE_Malloc提供了更丰富的、面向字节的内存池管理,内存池可以变长、变个数,分配时在池中寻找最佳匹配,不足时进行立即分配
-
- ACE_Allocator_Adapter将变长内存池管理器
MALLOC
包装成Allocator
- ACE_Allocator_Adapter将变长内存池管理器
-
- 其他
*Memory_Pool
组件,可以将ACE_Malloc
的内存池管理扩展到更宽的面
- 其他
对ACE基于模板开发的新认识
- 一个组件仅解决一个小问题,通过组合方式,或浅层次继承实现扩展
- 更多使用模式,以及模板的弱类型限制能力,实现代码的自动生成、扩展
ACE在基类使用虚析构函数反而用的并不多,后面有空探究下它这方面的设计哲学
参考
man ACE Allocator