1 标准接口
张老师在课上讲述了C++内存分配器的标准接口,接口规格如下:
- 一组typedef:
-allocator::value_type
-allocator::pointer
-allocator::const_pointer
-allocator::reference
-allocator::const_reference
-allocator::size_type
-allocator::difference_type - allocator::rebind allocator的内嵌模板,需要定义other成员
- allocator::allocator() 构造函数
- allocator::allocator(const allocator&) 拷贝构造函数
- allocator::~allocator() 析构函数
- pointer allocator::address(reference x)const 返回对象地址
- pointer allocator::allocate(size_type n, const void *=0) 分配空间
- void allocator::deallocator(pointer p, size_type n) 释放空间
- size_type allocator::max_size() const 可以分配的最大空间
- void allocator::construct(pointer p, const T&x) 构造分配内存中的对象
- void allocator::destroy(pointer p) 析构内存对象
2 用法
allocator的用法有两种:
第一种是直接使用allocator来分配内存并管理内存.
allocator<int> alloc;
int *p = alloc.allocate(2); //分配足够存放2个Int数据的空间
int *free_space = p;
alloc.construct(free_space, 1); //构造分配空间内对象,使用allocate分配的空间必须使用construct来构造对象
free_space++;
alloc.construct(free_space, 2);
alloc.deallocate(p, 2); //释放空间
第二种是通过容器使用allocator。
vector<int, std::allocator> vec;
vec.push_back(1);
一般情况下,都是在容器中使用内存分配器,不推荐直接使用allocator。如果遇到需要使用内存分配的情况,可以使用new/delete代替。
3 分配器实现
GUN C++除了标准库使用的std::allocator内存分配器外,还实现了以下分配器。
bitmap_allocator 使用位来表示内存是否使用的分配器
debug_allocator 加入调试信息的分配器
malloc_allocator 简单地封装了malloc和free函数
new_allocator 对new/delete函数进行封装
pool_allcator 基于内存池的实现
throw_allocator 用于异常
mt_allocator 对多线程环境进行了优化
上述分配器的实现都在GNU的ext目录下,使用范例如下:
#include <ext/bitmap_allocator.h>
vector<int, __gnu_cxx::bitmap_allocator> vec;
网友评论