1、new和delete有一些灵活性上的局限:new把内存分配和对象构造组合在了一起;delete将对象析构和内存释放组合在了一起。
 
2、当分配一大块内存时,我们通常计划在这块内存上按需构造对象,在此情况下,我们希望将内存分配和对象构造分离;这意味着我们可以分配大块内存,但只在真正需要的时候才真正执行对象创建操作。
 
3、allocator类,定义在头文件memory中,它帮助我们将内存分配和对象构造分离开来,它提供一种类型感知的内存分配方法,它分配的内存是原始的、未构造的。在分配内存时,它会根据对象类型来确定恰当的内存大小和对齐位置。
 
4、allocator类中的算法
#ifndef _ALLOCATOR_H_
#define _ALLOCATOR_H_ #include<memory>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
class Allocator { //这个是自己命名的类
public:
/**
* 内存分配练习
* allocate(n),分配大小为n未初始化空间;
* construct(q),对q指向的空间进行默认初始化;construct(q,"j"),对q指向的空间初始化为"j",只要是合法的初始化器就可以;
* destroy(q),对q指向的对象进行析构
* deallocate(p,n),释放原始分配的空间,必须先把内存中的对象全部析构,然后全部释放,不能只释放一部分
*/
void allocator_test(const int &n) {
allocator<string>alloc;
auto p = alloc.allocate(n);//分配保存n个string的原始内存
auto q = p;
while (q != p + n) {
alloc.construct(q++, "zhizhiyu");//构造n个string
}
cout << "构造的第一个string是:"<<*(p) << endl;
while (q != p) {
alloc.destroy(--q);//对分配的对象进行析构
}
alloc.deallocate(p, n);//释放内存
}
/**
* 拷贝和填充原始内存,allocate,deallocate,
* uninitialized_copy(b,e,b2),向原始空间b2中拷贝由b和e指定范围的元素,返回递增之后的目的位置寄存器,指向下一个未构造的位置
* uninitialized_copy_n(b,n,b2),向原始空间b2中拷贝由b开始的n个元素,返回递增之后的目的位置寄存器,指向下一个未构造的位置
* uninitialized_fill(b,e,t),b和e范围指定的原始内存用元素t填充,无返回值
* uninitialize_fill_n(b,n,t),b开始的n个原始内存空间用元素t填充,无返回值
*/
void alloc_copy_and_fill(const vector<int>&v) {
int n = v.size();
allocator<int> alloc;
auto p = alloc.allocate(n * );
auto q = uninitialized_copy(v.begin(), v.end(), p);//拷贝v到未初始化空间中
q = uninitialized_copy_n(v.begin(), n, q);//再把v拷贝一遍
uninitialized_fill(q, q + n, );//用22填上接下来n个空间
uninitialized_fill_n(q+n, n, );//剩余n个空间变为44
auto pq = q + *n;
while (pq != p) {
cout << *(--pq) << " ";
alloc.destroy(pq);
}
alloc.deallocate(p, n * );
}
}; #endif

[C++] 空间配置器——allocator类的更多相关文章

  1. C++ 空间配置器(allocator)

    C++ 空间配置器(allocator) 在STL中,Memory Allocator 处于最底层的位置,为一切的 Container 提供存储服务,是一切其他组件的基石.对于一般使用 STL 的用户 ...

  2. 《STL源码剖析》chapter2空间配置器allocator

    为什么不说allocator是内存配置器而说是空间配置器,因为空间不一定是内存,也可以是磁盘或其他辅助介质.是的,你可以写一个allocator,直接向硬盘取空间.sgi stl提供的配置器,配置的对 ...

  3. STL源码剖析 — 空间配置器(allocator)

    前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配 ...

  4. C++ STL学习之 空间配置器(allocator)

    众所周知,一般情况下,一个程序包括数据结构和相应的算法,而数据结构作为存储数据的组织形式,与内存空间有着密切的联系. 在C++ STL中,空间配置器便是用来实现内存空间(一般是内存,也可以是硬盘等空间 ...

  5. STL学习笔记:空间配置器allocator

    allocator必要接口: allocator::value_type allocator::pointer allocator::const_pointer allocator::referenc ...

  6. STL源码剖析——空间配置器Allocator#1 构造与析构

    以STL的运用角度而言,空间配置器是最不需要介绍的东西,因为它扮演的是幕后的角色,隐藏在一切容器的背后默默工作.但以STL的实现角度而言,最应该首先介绍的就是空间配置器,因为这是这是容器展开一切运作的 ...

  7. STL源码剖析——空间配置器Allocator#2 一/二级空间配置器

    上节学习了内存配置后的对象构造行为和内存释放前的对象析构行为,在这一节来学习内存的配置与释放. C++的内存配置基本操作是::operator new(),而释放基本操作是::operator del ...

  8. STL之空间配置器allocator

    摘要 C++STL的空间配置器将内存的分配.释放,对象的构造.析构都分开执行,内存分配由alloc::allocate()负责,内存的释放由alloc::deallocate()负责:对象的构造由:: ...

  9. STL源码剖析——空间配置器Allocator#3 自由链表与内存池

    上节在学习第二级配置器时了解了第二级配置器通过内存池与自由链表来处理小区块内存的申请.但只是对其概念进行点到为止的认识,并未深入探究.这节就来学习一下自由链表的填充和内存池的内存分配机制. refil ...

随机推荐

  1. k8s云集群混搭模式,可能帮你节省50%以上的服务成本

    现在大部分中小企业或团队都是使用云平台来部署自己的服务,如阿里云,亚马逊云等.一般来说,业务的负载都具备一定的规律,比如每天集中在某几个小时,或呈现时间段周期性波峰.波谷交替的现象,如下图 如果使用E ...

  2. bs4-BeautifulSoup

    1.BeautifulSoup下载 pip install BeautifulSoup4 或者 pip install bs4 pip install lxml #解析器 2.BeautifulSou ...

  3. zookeeper的leader选举机制个人总结

    第一步:每个服务器都首先投自己,格式为<sid,zxid>: 第二步:然后将自己的投票以<sid,zxid>形式发送给其他服务器,这样每个服务器除了自己的投票,还有集群中除了自 ...

  4. 使用Makefile构建Docker

    使用Makefile构建Docker 刚开始学习docker命令的时候,很喜欢一个字一个字敲,因为这样会记住命令.后来熟悉了之后,每次想要做一些操作的时候就不得不 重复的输入以前的命令.当切换一个项目 ...

  5. 什么是W3C??

    为什么想着写这个博客呢,因为最近准备简历去面试,看到好多公司上面都写着熟悉 w3c ,很纳闷,我是一个新手,w3c是什么呢?没听过!!! 所以就去网上查了: 什么是W3C? W3C 万维网联盟(wor ...

  6. ionic $ioniActionSheet 在安卓手机没样式

    解决方法: 添加以下修复css样式 /** * Action Sheets for Android * ------------------------------------------------ ...

  7. 《Java 编写基于 Netty 的 RPC 框架》

    一 简单概念 RPC: ( Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样. 阻塞IO :当阻塞 ...

  8. Python从入门到精通之环境搭建

    本章内容: Windows系统环境搭建 Linux系统环境搭建 Mac OS系统环境搭建 一.下载python安装包 下载地址:https://www.python.org/downloads/ 二. ...

  9. Badboy - 从excel中读取数据

    参考: http://leafwf.blog.51cto.com/872759/1119161 http://www.51testing.com/html/00/130600-1367743.html ...

  10. mysql 主主从配置

    配置主服务器:主服务器1 Ip:  192.168.0.1 主服务器2 Ip:  192.168.0.2 主服务器1配置 2.1.修改mysql配置文件 vim /etc/my.conf Server ...