_STL_jjalloc.h

#pragma once
#ifndef _JJALLOC_
#define _JJALLOC_
#include <iostream>
#include <cstdlib>
#include <new>namespace JJ
{//配置空间,size是要分配的元素个数,第二个参数用处不清楚template <class T>inline T* _allocate(ptrdiff_t size, T*){/*set_new_handler是一个输入并返回new_handler类型的函数。set_new_handler的输入参数是operator new分配内存失败时要调用的出错处理函数的指针,返回值是set_new_handler没调用之前就已经在起作用的旧的出错处理函数的指针.new_handler是一个自定义的函数指针类型,它指向一个没有输入参数也没有返回值的函数,用于处理分配内存时出现的异常*/set_new_handler(0);/*new:运算符,有new和::new之分,前者位于stdoperator new():它是一个函数,并不是运算符。对于operator new来说,分为全局重载和类重载,全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size).operator new()完成的操作一般只是分配内存,事实上系统默认的全局::operator new(size_t size)也只是调用malloc分配内存,并且返回一个void*指针。而构造函数的调用(如果需要)是在new运算符中完成的*/T* tmp = (T*)(::operator new((size_t)(size*sizeof(T))));if (tmp == 0){cerr << "out of memory" << endl;exit(1);}return tmp;}//释放内存空间template <class T>inline void _deallocate(T* buffer){::operator delete(buffer);}//构造template <class T1,class T2>inline void _construct(T1* p, const T2& value){//在指针p所指向的内存空间创建一个类型为T1的对象,调用的构造函数接受一个类型为const T2&//(或其他兼容类型)的参数//如果想在预分配的内存上创建对象,用缺省的new操作符行不通,可以用placement new构造,它允许你构造一个新对象//到预分配的内存上new(p) T1(value);}//析构template <class T>inline void _destroy(T* ptr){ptr->~T();}template<class T>class allocator{public:typedef T value_type;typedef T* pointer;typedef const T* const_pointer;typedef T& reference;typedef const T& const_reference;typedef size_t size_type;typedef ptrdiff_t difference_type;//用处是什么?template <class U>struct rebind{//嵌套的类模板typedef allocator<U> other;};pointer allocate(size_type n, const void *hint = 0){return _allocate((difference_type)n, (pointer)0);}void deallocate(pointer p, size_type n){_deallocate(p);}void construct(pointer p, const T& value){_construct(p, value);}void destroy(pointer p){_destroy(p);}//返回某个对象的地址
        pointer address(reference x){return (pointer)&x;}const_pointer const_address(const_reference x){return (const_pointer)&x;}size_type max_size() const{return size_type(UINT_MAX / sizeof(T));}};
}
#endif

测试程序:

#include "_STL_jjalloc.h"
#include <iostream>using namespace std;class Test
{
public:int x;Test(int b = 0) {x = b;}~Test() {}
};
int main()
{int x = 4;JJ::allocator<int> a;JJ::allocator<Test> b;//分配内存int *p = a.allocate(1);Test *t = new Test;b.construct(t, x);*p = 1;cout << *p << endl;//1cout << t->x << endl;//4cout << *(a.address(x)) << endl;//4cout << a.max_size() << endl;b.destroy(t);a.deallocate(p, 1);system("pause");return 0;
}

转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4935953.html

一个简单的空间配置器相关推荐

  1. 设计一个简单的空间配置器

    //#ifndef GRAVELALLOC_H_INCLUDED //#define GRAVELALLOC_H_INCLUDED#ifndef _GravelALLOC_ #define _Grav ...

  2. 2.1 空间配置器(allocator)

    空间配置器隐藏在一切组件之后. 1.1 设计一个简单的空间配置器 根据STL的规范,以下是allocator的必要接口: allocator::value_type allocator::pointe ...

  3. STL_空间配置器allocator

    空间配置器 所有的STL的操作对象(所有的数值)都存放在容器内,而容器一定要配置空间才能存放资料 空间配置器的标准接口 typedef unsigned int size_t: allocator:: ...

  4. SGI STL 空间配置器

    文章目录 一.空间配置器 二.为什么使用空间配置器? 三.construct.h 四.std::alloc的实现 关于std::alloc stl_alloc.h 空间的配置与释放 一级配置器 二级配 ...

  5. STL源码剖析 空间配置器 查漏补缺

    ptrdiff_t含义 减去两个指针的结果的带符号整数类型 ptrdiff_t (Type support) - C 中文开发手册 - 开发者手册 - 云+社区 - 腾讯云 std::set_new_ ...

  6. malloc开辟的空间在哪一个区间_C++进阶系列之STL(2)SGI版本空间配置器

    1.STL中的空间配置器在STL中,空间配置器分了2组,分别为一级空间配置器和二级空间配置器,但是它们都有自己各自运用的场合:一般说来,一级空间配置器一般分配的空间大于128B,二级空间配置器的分配空 ...

  7. stl源码剖析_《STL源码剖析》学习笔记——空间配置器

    目录 1. 空间配置器概述 2. 构造和析构基本工具 3. 空间的配置与释放,std::alloc 4. 内存基本处理工具 1. 空间配置器概述 从STL的实现角度来看,空间配置器的位置尤为重要,整个 ...

  8. C++ STL : SGI-STL空间配置器源码剖析

    文章目录 空间配置器的概念 SGI-STL空间配置器 一级空间配置器 二级空间配置器 申请空间 补充内存块 从内存池中索要空间 空间回收 内存碎片 外碎片 内碎片 空间配置器的再次封装 空间配置器的概 ...

  9. STL中的空间配置器

    STL中的空间配置器 文章目录 STL中的空间配置器 1. 什么是空间配置器 2. 为什么需要空间配置器 3. SGI-STL空间配置器实现原理 3.1 一级空间配置器 3.2 二级空间配置器 3.1 ...

  10. STL 源码剖析 空间配置器

    以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container) 的背后 但是STL的操作对象都存放在容器的内部,容器离不开内存空间的分配 为什么 ...

最新文章

  1. 整数转化成字符串; 字符串转换为整数
  2. django-python3-mysql问题
  3. 易天教你如何保养SFP光模块
  4. when will be _oControlStore available for S4.controller.js
  5. Xcode 8带来的新特性和坑
  6. 关于u-boot中的.balignl 16,0xdeadbeef的理解
  7. 极限学习机︱R语言快速深度学习进行回归预测
  8. c语言的实验,c语言 实验1
  9. 新颖的计算机科学与技术毕业设计题目
  10. 桌面计算机图标变成文件夹,电脑桌面图标全部变成白色文件了怎么办
  11. Object-Oriented Programming Summary Ⅱ
  12. Qt操作Excel类
  13. RabbitMq消息队列进一步认识
  14. 云计算导论(第二版)李伯虎著全部课后题的答案
  15. cmd命令行窗口打开python文件显示拒绝访问
  16. Java数据结构——排序二叉树
  17. mata name,property=og:title|og:image的几种说明
  18. 哨兵2号(Sentinel-2)卫星数据批量处理
  19. Centos7.4下安装Nvidia驱动
  20. pfam基本介绍,以及蛋白质序列下载

热门文章

  1. 深入理解Yii2.0(1) 属性
  2. SSO之CAS+LDAP实现单点登录认证
  3. 为什么hashtable中桶的数目都是用质数表示
  4. MapReduce官方案例wordcount
  5. 如何确定autosar的版本_什么是AUTOSAR?AUTOSAR的概要、背景以及目的-汽车电子-与非网...
  6. LeetCode:每日一题(2020.4.13)
  7. 只开窗不镀锡_开窗也有大学问,只有老司机才懂这些车窗使用技巧
  8. 人物关系图谱:ECharts 实现
  9. apache commons Java包简介
  10. 深度学习笔记_ResNet