内存分配器[GeekBand]

1 标准接口

张老师在课上讲述了C++内存分配器的标准接口,接口规格如下:

  1. 一组typedef:
    -allocator::value_type
    -allocator::pointer
    -allocator::const_pointer
    -allocator::reference
    -allocator::const_reference
    -allocator::size_type
    -allocator::difference_type
  2. allocator::rebind allocator的内嵌模板,需要定义other成员
  3. allocator::allocator() 构造函数
  4. allocator::allocator(const allocator&) 拷贝构造函数
  5. allocator::~allocator() 析构函数
  6. pointer allocator::address(reference x)const 返回对象地址
  7. pointer allocator::allocate(size_type n, const void *=0) 分配空间
  8. void allocator::deallocator(pointer p, size_type n) 释放空间
  9. size_type allocator::max_size() const 可以分配的最大空间
  10. void allocator::construct(pointer p, const T&x) 构造分配内存中的对象
  11. void allocator::destroy(pointer p) 析构内存对象

2 用法

allocator的用法有两种:
第一种是直接使用allocator来分配内存并管理内存.

allocator 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 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
vector vec;

你可能感兴趣的:(内存分配器[GeekBand])