原文:Ogre的内存分配策略

读这个之前,强烈建议看一下Alexandrescu的modern c++的第一章关于policy技术的解释。应该是这哥们发明的,这里只是使用。

首先列出涉及到的头文件:(这几个头文件彼此之间相关性挺大的,应该一起看)

只在调试期使用:

OgreMemoryTracker.h

这个头文件中定义了MemoryTracker这个类,用来测试和调试Ogre的内存分配系统的。能跟踪内存的分配、回收、泄漏和统计信息。Ogre使用者不需要关注。

OgreAlignedAllocator.h

内存分配无非就对齐和不对齐两种,不对齐的话就不必要建立内存结构,但是对齐的话就需要按对齐的内存结构(本实现提供了与平台相同的对齐或者2的整数次方个位对齐供选择使用)。本文件就是定义了一个对齐的内存结构AlignedMemory,如果内存分配器决定使用对齐的,那么上层逻辑(比如什么时候分配,分配多少)由分配器决定,具体执行就得交给AlignedMemory这个类了。

其实这个类也就两个函数,一个allocate,一个deallocate,完成具体的分配工作。

OgreMemoryStdAlloc.h

这个类是个host类(host类就是组合使用policy的类),如果你看过modern c++的第一章就明白了。用的是policy的思想,把分配器和具体的分配策略分开,方便将分配器与不同的分配策略组合。这里说的分配器就是这里定义的host类STLAllocator。(具体的policy在OgreMemorySTLAllocator.h里定义)

OgreMemoryAllocatedObject

这个头文件定义了一个类AllocatedObject,供所有使用自定义内存分配policy来执行new和delete的类。也就是说这个类与STLAllocator类似,也是个host类,重载了new和delete。

AllocatedObject和STLAllocator的区别在于STLAllocator相当于在可以在程序的任何地方使用的malloc和free,使用者可以是主程序,可以是类,或函数等只要想要申请空间的东西,但是AllocatedObject则是对new和delete的重新定义,想要有自己的new和delete的类都应该继承这个类(你也可以自己的类里重载new 和delete,但是Ogre提供了基于policy的这个接口机制,好处在于内存分配策略可以非常方便的更改)

OgreMemorySTLAllocator.h

这个头文件定义了两个具体的policy类,就是供STLAllocato和AllocatedObjectr使用的不同内存分配策略。一个是StdAllocPolicy类(分配策略,直接简单封装malloc和free),一个是StdAlignedAllocPolicy类(分配策略,手动计算对齐之后调用malloc和free)。实际上,我们的电脑都有默认对齐,malloc也会自动对齐分配,所以除非你的对齐方法和默认不一样,否则直接使用StdAllocPolicy就好。

OgreMemoryNedAlloc.h

这个头文件也是定义供STLAllocator和AllocatedObject组装使用的内存分配policy的类:NedAllocPolicy,NedAlignedAllocPolicy。这里的ned内存分配器有个自己的主页:http://nedprod.com/programs/portable/nedmalloc/index.html,号称是最快速的内存分配器。这个policy就是对这个内存分配器的一个封装。

OgreMemoryNedPooling.h

嗯,这也是ned内存分配器的一个封装,供STLAllocator和AllocatedObject组装使用。有两个类:NedPoolingPolicy,NedAlignedPoolingPolicy,与上个的区别和联系就看人家的官网吧。我们只需要知道这是几种不同的内存分配策略而已,说白了要么是对malloc和free的重新封装,要么是自己重新定义了累心malloc和free的系统。

OgreMemoryAllocatorConfig.h

这个头文件不定义类,只做配置。配置啥呢?看其他的代码,例如Root,会public一个RootAlloc,这个RootAlloc就是一个内存分配的policy,无非是上面说的几种,但上面没叫这个的。这个头文件就干这个,用typedef把不同的Ogre对象使用的内存管理policy都定义下自己的名字,还根据选用的policy定义了OGRE_NEW等宏,也就是说,Ogre不打算让库使用者使用自己的new,malloc,delete等函数,,全部封装了。

综上,知道Ogre的内存分配系统用的policy技术(包括host和具体的policy,详见modern c++),host部分向提供了两个接口STLAllocattor、AllocatedObject,可用的内存分配策略(policy)有6种:StdAllocPolicy、StdAlignedAllocPolicy、NedAllocPolicy、NedAlignedAllocPolicy、NedPoolingPolicy、NedAlignedPoolingPolicy

搞这么大阵势,最后其实你可以直接很简单的在自己的类里重载下constructor和new之类的玩意实现,但是为啥要费这个事?这就是设计模式啦~~~~设计模式的好,是方便代码重用和修改。搭起这个架构是好,日后想要修改或增加policy易如反掌,要是你想要自己实现。那等着哭吧,每个类都得改了。

【转载】Ogre的内存分配策略相关推荐

  1. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,G ...

  2. AGG第七课 内存分配策略

    说明 AGG采用new/delete函数操作堆内存,有时候并不是最佳的选择.另一方面,STL的内存分配策略太繁琐,因此没有采用.在agg_allocator.h文件中描述目前内存分配策略: templ ...

  3. Memcache 内存分配策略和性能(使用)状态检查

    一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作.有兴趣的 ...

  4. 垃圾收集器与内存分配策略(五)之垃圾日志与常见参数

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集器与内存分配策略(五)--垃圾日志与常见参数 理解GC日志 每个收集器的日志格式都可以不一样,但各个每个收集器的日志都 ...

  5. Java虚拟机-第二篇-GC算法与内存分配策略

    2019独角兽企业重金招聘Python工程师标准>>> GC引入 在Java的运行时数据区中,程序计数器.虚拟机栈.本地方法栈三个区域都是线程私有的,随线程而生,随线程而灭,在方法结 ...

  6. JVM内存管理:深入垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  7. 【深入理解Java虚拟机学习笔记】第三章 垃圾收集器与内存分配策略

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  8. 【转】JVM内存管理:深入垃圾收集器与内存分配策略

    2019独角兽企业重金招聘Python工程师标准>>> Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收 ...

  9. jvm垃圾收集器与内存分配策略

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集器与内存分配策略: 以下参考周志明的<<深入理解jvm高级特性与最佳实践>>. 判断对象是否存 ...

最新文章

  1. matlab去除图片水印_Python利用OpenCV去除图片水印
  2. windows下编译jsoncpp 1.y.z
  3. 读取数量不定的输入数据
  4. BeetleX之vue-autoui自匹配UI插件
  5. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法
  6. 基于RV1126平台imx291分析 --- media部件连接 三
  7. 大地经纬度坐标系与Web墨卡托坐标系的转换
  8. CSS基础:浅用字体图标(以阿里字体图标库演示)
  9. python如何进行数据挖掘_如何使用python实现文本数据挖掘?
  10. 【原】JUNIT 源码分析之TestSuite
  11. CSS实现抽奖大转盘
  12. JAVA Oracle插入大量数据优化
  13. 教你如何使用语雀提高效率
  14. chrome浏览器的性能测试--本文引用自 百度百科http://baike.baidu.com/view/1835504.htm
  15. 淘宝接入微信,并将支持微信支付
  16. 实现财务自由 之 A 股上市公司的年报(年度财报)查阅查看、下载地址、以及下载的方法
  17. 数学建模算法 一 简述(3)规划模型-整数规划
  18. 【转载】数据(机器学习/深度学习)竞赛平台——Kaggle 置顶
  19. (python)map,list,set删除元素
  20. ESXi安装CentOS

热门文章

  1. MOS管正确选择的步骤
  2. 免费发布一个简单而有趣的计算工具
  3. 软件测试--selenium安装使用
  4. 性能测试之JMeter测试结果写入Excel
  5. 03-30 兼容性测试
  6. php异步发送邮件,php通过fsockopen异步发送邮件
  7. python websocket django vue_Django资料 Vue实现网页前端实时反馈输出信息
  8. 实现一个基于Vue的Button小组件
  9. an7062个引脚工作电压_马兰士PM711AV功放电路原理分析
  10. atop用法_linux高级监控atop的使用