内存分配器[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<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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,534评论 1 51
  • 【转载】原文地址:std::string详解作者:kieven2008 之所以抛弃char*的字符串而选用C++标...
    VAYY阅读 656评论 0 2
  • GeekBand STL与泛型编程 Third Week 变易算法 变易算法是指那些改变容器中对象的操作。具体包括...
    不会飞的鸟人阅读 321评论 0 0
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,767评论 0 9
  • 接着上节 condition_varible ,本节主要介绍future的内容,练习代码地址。本文参考http:/...
    jorion阅读 14,835评论 1 5