allocator详解
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详解相关推荐
- Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解
文章目录 前言 Rocksdb写流程图 WAL 原理分析 概述 文件格式 查看WAL的工具 创建WAL 清理WAL MANIFEST原理分析 概述 查看MANIFEST的工具 创建 及 清除 MANI ...
- cat /proc/meminfo 各字段详解
一.cat /proc/meminfo 各字段详解 / $ cat /proc/meminfo MemTotal: 877368 kB :所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码 ...
- memcached使用详解
memcached使用详解 一.memcached介绍 1.基于libevent的事件处理 libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BS ...
- Ubuntu16.04下Mongodb官网安装部署步骤(图文详解)(博主推荐)
不多说,直接上干货! 在这篇博客里,我采用了非官网的安装步骤,来进行安装.走了弯路,同时,也是不建议.因为在大数据领域和实际生产里,还是要走正规的为好. Ubuntu16.04下Mongodb(离线安 ...
- STL中map和string, vector 用法详解
1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...
- C 和 C++字符串详解
From:http://blog.csdn.net/fenxinzi557/article/details/51457829 From:http://www.cnblogs.com/xFreedom/ ...
- C++11 并发指南四(future 详解二 std::packaged_task 介绍)
上一讲<C++11 并发指南四(<future> 详解一 std::promise 介绍)>主要介绍了 <future> 头文件中的 std::promise 类, ...
- C++11 并发指南四(future 详解一 std::promise 介绍)
前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...
- C++/C--unordered_map常见用法详解
文章目录 1. std::unordered_map 的定义与特性 2. 构造 std::unordered_map 3. 赋值操作 4. 迭代器操作 4.1 指向整个容器中的元素 4.2 指向某个桶 ...
最新文章
- 将 CentOS 8 操作系统迁移到 Oracle Linux
- JS生成x到y的随机数
- Python数模笔记-模拟退火算法(1)多变量函数优化
- mosquitto查看订阅记录_Mosquitto\Client
- html5中颜色范围,HTML5输入范围:将runnable-track的颜色更改为当前值
- 认知心理学告诉你什么才是高效学习
- CentOS 7 忘记root密码的解决之道
- 如何调试一个无法重现的错误?
- CCNA学习指南-----1-3章笔记
- postgresql和mysql语句区别_postgresql和mysql语句区别
- 飞盘比赛(入门oj Problem 5961)
- 说说用笔记本电脑的惨痛经历
- Stroke:利用人类遗传学理解缺血性卒中预后的机制
- Docker镜像安装宋体
- 重学编程-编程入门指南 v1.4
- 【算法千题案例】每日LeetCode打卡——68.反转字符串中的元音字母
- foxmail去除账户访问口令
- 【2020-11-11】JS逆向之蘑菇街商品数据接口解密
- IntelliJ IDEA详细配置图解,挖掘更多的功能!
- 分时操作系统(20世纪70年代)