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. 03 requests模块基础

    1. requests 模块简介 什么是requests 模块 requests模块是python中原生的基于网络请求的模块,功能强大,用法简洁高效.在爬虫领域中占据着半壁江山的地位.requests ...

  2. GSS系列

    GSS1 直接维护静态区间和即可 #include<bits/stdc++.h> using namespace std; ; int n,a[N]; ]; inline void pus ...

  3. Django之ORM-model模型关系

    模型类关系 1)一对多关系例:图书类-英雄类 models.ForeignKey() 定义在多的类中. 2)多对多关系例:新闻类-新闻类型类 体育新闻 国际新闻models.ManyToManyFie ...

  4. 设计模式(C#)——05适配器模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       自然界有一条规则--适者生存.意思是生物要使用自然界的变化:在程序界中则需要新环境调用现存对象.那么,如何在新环境中 ...

  5. 设计模式(C#)——02抽象工厂模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       在工厂模式中,一个工厂只能创建一种产品,但我们往往希望,一个工厂能创建一系列产品.很明显工厂模式已经不能满足我们的需 ...

  6. Mysql系列 - 第3天:管理员必备技能(必须掌握)

    这是mysql系列第3篇文章. 环境:mysql5.7.25,cmd命令中进行演示. 在玩mysql的过程中,经常遇到有很多朋友在云上面玩mysql的时候,说我创建了一个用户为什么不能登录?为什么没有 ...

  7. npm init,npm -y, npm install --save,npm install --save-dev

    npm init 初始化一个简单的package.json文件,执行该命令后终端会依次询问 name, version, description 等字段 npm init --yes|-y 作用同上, ...

  8. 转载java 8 为什么引入 lambda

    转载:https://www.cnblogs.com/keeya/p/11404631.html 在Java8出现之前,如果你想传递一段代码到另一个方法里是很不方便的.你几乎不可能将代码块到处传递,因 ...

  9. vue路由菜单权限设置就button权限设置

    路由权限的设计思路: 首先,我们的需要校验权限的路由的 url,全部由后端返回,后端会返回当前用户的路由树数组.前端在进入页面前请求接口,把数据拿到: 其次,前端会维护一个路由映射组件的列表,如果路由 ...

  10. ubuntu使用yum安装软件问题

    其实ubuntu是不应该用yum来管理软件安装的,只是后来才发现的,这里记录一下尝试的过程. 一开始是想把windows桌面上的文件拖到xshell登录的ubuntu的目录中,但是没成功,参考http ...