原文: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. c语言一个偶数用两个素数表示,用java怎样编写一个偶数总能表示为两个素数之和的程序...
  2. python自学书籍推荐豆瓣-【转】如果有人让你推荐Python技术书,请让他看这个列表...
  3. 015_获取并设置CSS类
  4. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章
  5. MyBatisPlus的ActiveRecord实现CRUD
  6. Win10+tensorflow:SSD调试问题:Unable to open table file ../checkpoints/ssd_300_vgg.ckpt
  7. EasyUI datagrid 分页保持选中状态
  8. C++ class实现邻接表存储的图(完整代码)
  9. 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述
  10. IDEA创建.properties文件
  11. 免扣(抠)PNG格式图片,让你告别抠图之痛!
  12. 目标检测的性能上界讨论
  13. 智能优化算法:野狗优化算法 - 附代码
  14. 显示器、显卡的接口类型
  15. 免费计算机网络基础ppt,计算机网络基础
  16. C# 西门子PLC上位机开发环境搭建
  17. 【随笔】Linux drop_caches
  18. PostgreSQL全文检索
  19. 维修 空调 碰上 骗子
  20. python条形码识别_使用Python和OpenCV在视频中实时监测条形码

热门文章

  1. 《那些年啊,那些事——一个程序员的奋斗史》——107
  2. 五、扩展Orchard(一) First Steps into Orchard
  3. Scrapy 轻松定制网络爬虫
  4. 如何写博客(网摘)第一步:我是谁?
  5. sf | 创建空间矢量对象及其投影设置
  6. delphi和python比较_Python For Delphi---更好地协同
  7. android web developer,Growth: 一个关于如何成为优秀Web Developer 的 App
  8. 码匠编程:学习Web前端开发时有哪些技术点
  9. 从删库到跑路,就是这么迅速!程序员为了报复同事删了公司数据库
  10. 程序员能靠技术渡过中年危机吗?