#include <iostream>
#include <cstddef>using namespace std;//ref. Effective C++ 2e,item 10
//1.malloc效率
//2.cookie管理
//per-class allocator,2class Airplane {
private:struct AirplaneRep {unsigned long miles;char type;  };
private:union {AirplaneRep rep;  //此处针对使用中的objectsAirplane* next;  //处针对free list上的object//embeded pointer 嵌入式指针};
public:unsigned long getMiles() {return rep.miles;}char getType() {return rep.type;}void set(unsigned long m, char t) {rep.miles = m;rep.type = t;}
public:static void* operator new(size_t size);static void operator delete(void* deadObject, size_t size);
private:static const int BLOCK_SIZE;    static Airplane* headOfFreeList;
};Airplane* Airplane::headOfFreeList = 0;
const int Airplane::BLOCK_SIZE = 512;   void* Airplane::operator new(size_t size) {//如果大小有误,转交给::operator new()//继承体系中if(size != sizeof(Airplane)) {return ::operator new(size);}Airplane *p = headOfFreeList;if(p) {//如果p有效,就把list头部下移一个元素headOfFreeList = p->next;} else {//free list是空的,所以申请一大块Airplane* newBlock = static_cast<Airplane*>(::operator new(BLOCK_SIZE * sizeof(Airplane)));     //将小块串成一个free list,//但跳过 #0, 因它将被传回做为本次成果for(int i=1; i<BLOCK_SIZE-1; ++i) {newBlock[i].next = &newBlock[i+1];}newBlock[BLOCK_SIZE-1].next = 0;p = newBlock;headOfFreeList = &newBlock[1];}return p;
}void Airplane::operator delete(void* deadObject, size_t size) {if(deadObject == 0) return;if(size != sizeof(Airplane)) {::operator delete(deadObject);return ;}Airplane* carcass = static_cast<Airplane*>(deadObject);carcass->next = headOfFreeList;headOfFreeList = carcass;
}int main() {cout << "sizeof(Airplane)" << sizeof(Airplane) << endl;size_t const N = 100;Airplane* p[N];for(int i=0; i<N; ++i) {p[i] = new Airplane;}p[1]->set(1000, 'A');p[5]->set(2000, 'B');p[9]->set(500000, 'C');for(int i=0; i<10; ++i) {cout << p[i] << endl;}cout << p[1]->getType() << " " << p[1]->getMiles() << endl;for(int i=0; i<N; ++i) {delete p[i];p[i] = NULL;}return 0;
}

使用member operator/delete的结果,相邻的地址之间没有cookie

Per-class allocator 2相关推荐

  1. 2.1 空间配置器(allocator)

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

  2. STL内存分配器:allocator

    一.STL泛型容器 与 内存管理 1.1 STL泛型容器中隐藏了内存管理工作 STL提供了很多泛型容器,如vector,list,map等.程序员使用时之关心如何存放对象,不用关心如何管理内存. 容器 ...

  3. 动态数组 allocator

    问题来源 在编写程序的时候,对数组."二维数组"的分配的删除掌握的不是很清楚,不能正确的进行定义初始化. 以及在使用vector的时候,如何正确的定义及初始化 注意!!! 尽量使用 ...

  4. hash_map allocator

    1 hash_map定义在__gnu_cxx下 template<class _Key, class _Tp, class _HashFcn = hash<_Key>,        ...

  5. C++ Primer 5th笔记(chap 12 动态内存)allocator类

    1. 标准库allocator类及其算法 算法 说明 allocator <.T> a 定义了一个名为a的allocator对象,他可以为类型T的对象分配内存 a.allocate(n) ...

  6. 一个return引发的血案 - 自己动手实现allocator

    最近在追旧番<STL代码剖析>.真的是很旧很旧的番了,STL在94年开始走入STL,这本书则是2002年出版的,C++03和C++11还不知何在的年代.看完第二章之后合上书,想自己写一个a ...

  7. A good memory allocator is everything that I need

    A good memory allocator is everything that I need A good memory allocator is everything that I need, ...

  8. Rust切换allocator

    Rust支持2个内存分配器(allocator):alloc_system和alloc_jemalloc. alloc_jemalloc不支持valgrind,valgrind是查看内存泄漏很有帮助的 ...

  9. 利用std::allocator实现自定义的vector类

    std::allocator即空间配置器,用于内存分配.更多的细节建议大家研究相关源码. 这里仅是利用std::allocator来实现简单的自定义vector类,如有问题欢迎指正. 1 #inclu ...

  10. boost::detail::allocator模块的测试程序

    boost::detail::allocator模块的测试程序 实现功能 C++实现代码 实现功能 boost::detail::allocator模块的测试程序 C++实现代码 #include & ...

最新文章

  1. Verilog设计实例(4)详解全类别加法器(一)
  2. http提交json格式数据自动加\
  3. hadoop 配置项的调优
  4. 网际协议:数据报格式和分片以及IPv4编址
  5. 字符串的压缩【百度】
  6. hashmap 扩容是元素还是数组_HashMap 中的容量与扩容实现
  7. python attention机制_从零开始学Python自然语言处理(26)—— 强大的Attention机制...
  8. 计算机专业本科毕业转行会计,大学里就业最难的5个专业,毕业后难找工作,很多同学都转行了!...
  9. 数据结构-栈(先进后出表)
  10. SpringMVC,3种不同的URL路由配置方法 [转]
  11. MFC应用中对界面的设计(图标,标题,窗口)(VS2019)
  12. 各个版本的cmake下载
  13. 软件测试工程师笔试题带答案(一)
  14. windows免安装版mysql
  15. QML 中如何动态创建组件
  16. 2021最热门的后端编程语言排行榜出炉!
  17. 网吧组网新趋势:双光纤接入+千兆到桌面(转)
  18. 高通MSM8974芯片参考资料免费下载
  19. freebsd SSH配置详解
  20. centos一键安装apache服务器

热门文章

  1. 一步步实现 Redis 搜索引擎 1
  2. 流媒体技术学习笔记之(十五)FFmpeg编码遇到的错误、警告、Debug记录
  3. 8月第4周.COM域名总量达744万个 涨幅环比缩小
  4. 巴蒂尔7个三分火箭破网 麦蒂战表兄取缺姚后首胜
  5. 图解Raft:应该是最容易理解的分布式一致性算法
  6. 学习GRPC(一) 简单实现
  7. OO第一单元总结——多项式求导
  8. 【Java架构:基础技术】一篇文章搞掂:MySQL
  9. wdatepicker时间段控制
  10. 《C++ Primer》读书笔记—第六章 函数