vector和内存池

最近看内存池有关的东西,又回顾了一下之前看C++ Primer时自己写的vector,发现只是对基本的Vector的成员函数进行了重写,最重要的地方也就是分配器用的都是默认的,所以内存分配这块之前就没弄清楚。

template<class _Ty,
class _Alloc = allocator<_Ty> >class vector: public _Vector_alloc<_Vec_base_types<_Ty, _Alloc> >

从STL中vector的源码可以看出,vector分为两个部分,一个是参数类型 _Ty,这里的class跟typename是同一个东西,没有区别;还有一个是分配器 _Alloc,默认是allocator< _Ty >,内存池实现就是在这里,自带的分配器只是简单的new一个内存,vector实现的时候,设立三个指针:

private:std::string *elements;               //分配内存的头指针std::string   *first_free;            //第一个空闲位置的指针std::string *cap;                   //开的内存容量指针std::allocator<std::string> alloc;  //分配器

这样简单的判断size==capacity时,重新分配一个大小是原本两倍的内存,再使用移动赋值将原本的数据迁移到新内存中。

分配器allocator

下面的表格是一个分配器所需实现的内存处理成员函数:

成员函数 简介
allocate 分配未初始化的存储 (公开成员函数)
deallocate 解分配存储 (公开成员函数)
construct 在分配的存储构造对象 (公开成员函数)
destroy 析构在已分配存储中的对象 (公开成员函数)

通过实现重载这些成员函数可以实现内存池

allocator::rebind

最近看内存池的实现,发现分配器中有一段代码看不懂:

template <typename U>
struct rebind {typedef MemoryPool<U> other;
};

这段代码是内存池中,原本的模板变量是T,但是其中又定义了一个U的变量,后来看STL中也都是这么实现的。

原因是这样的:因为内存池分配的时候不仅仅是普通变量,像链表这种还有next指针,所以为了实现这种变量,分配器定义一个other,使用的时候将原本T的普通分配器变换为U的节点分配器,T跟U是有联系的,如下:

template <typename T>
struct StackNode_
{T data;StackNode_* prev;
};/** T is the object to store in the stack, Alloc is the allocator to use */
template <class T, class Alloc = std::allocator<T> >
class StackAlloc
{public:typedef StackNode_<T> Node;typedef typename Alloc::template rebind<Node>::other allocator;private:allocator allocator_;
}

allocator详解相关推荐

  1. Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解

    文章目录 前言 Rocksdb写流程图 WAL 原理分析 概述 文件格式 查看WAL的工具 创建WAL 清理WAL MANIFEST原理分析 概述 查看MANIFEST的工具 创建 及 清除 MANI ...

  2. cat /proc/meminfo 各字段详解

    一.cat /proc/meminfo 各字段详解 / $ cat /proc/meminfo MemTotal: 877368 kB :所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码 ...

  3. memcached使用详解

    memcached使用详解 一.memcached介绍 1.基于libevent的事件处理 libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BS ...

  4. Ubuntu16.04下Mongodb官网安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 在这篇博客里,我采用了非官网的安装步骤,来进行安装.走了弯路,同时,也是不建议.因为在大数据领域和实际生产里,还是要走正规的为好. Ubuntu16.04下Mongodb(离线安 ...

  5. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  6. C 和 C++字符串详解

    From:http://blog.csdn.net/fenxinzi557/article/details/51457829 From:http://www.cnblogs.com/xFreedom/ ...

  7. C++11 并发指南四(future 详解二 std::packaged_task 介绍)

    上一讲<C++11 并发指南四(<future> 详解一 std::promise 介绍)>主要介绍了 <future> 头文件中的 std::promise 类, ...

  8. C++11 并发指南四(future 详解一 std::promise 介绍)

    前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...

  9. C++/C--unordered_map常见用法详解

    文章目录 1. std::unordered_map 的定义与特性 2. 构造 std::unordered_map 3. 赋值操作 4. 迭代器操作 4.1 指向整个容器中的元素 4.2 指向某个桶 ...

最新文章

  1. 将 CentOS 8 操作系统迁移到 Oracle Linux
  2. JS生成x到y的随机数
  3. Python数模笔记-模拟退火算法(1)多变量函数优化
  4. mosquitto查看订阅记录_Mosquitto\Client
  5. html5中颜色范围,HTML5输入范围:将runnable-track的颜色更改为当前值
  6. 认知心理学告诉你什么才是高效学习
  7. CentOS 7 忘记root密码的解决之道
  8. 如何调试一个无法重现的错误?
  9. CCNA学习指南-----1-3章笔记
  10. postgresql和mysql语句区别_postgresql和mysql语句区别
  11. 飞盘比赛(入门oj Problem 5961)
  12. 说说用笔记本电脑的惨痛经历
  13. Stroke:利用人类遗传学理解缺血性卒中预后的机制
  14. Docker镜像安装宋体
  15. 重学编程-编程入门指南 v1.4
  16. 【算法千题案例】每日LeetCode打卡——68.反转字符串中的元音字母
  17. foxmail去除账户访问口令
  18. 【2020-11-11】JS逆向之蘑菇街商品数据接口解密
  19. IntelliJ IDEA详细配置图解,挖掘更多的功能!
  20. 分时操作系统(20世纪70年代)

热门文章

  1. canvas图形中心旋转
  2. MFC按键响应长按操作
  3. 图解SQL面试题:如何多表查询 ?
  4. 新手入门先学习指绘还是板绘?两者有什么区别?
  5. nodejs实现rest接口
  6. c语言编程基础------0.2GCC和GNU的关系,以及GCC的用法
  7. 电脑核显可以用html吗,GPU性能测试:看最强核显能干翻哪些独显
  8. Map排序(Java)
  9. 我的web前端自学之路-心得篇:我为什么要学习web前端?
  10. 微信小程序中跳转到其他小程序