美文网首页
内存分配器[GeekBand]

内存分配器[GeekBand]

作者: clamxyz | 来源:发表于2016-07-03 17:52 被阅读0次

    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<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;

    相关文章

      网友评论

          本文标题:内存分配器[GeekBand]

          本文链接:https://www.haomeiwen.com/subject/fckcjttx.html