首页 技术 正文
技术 2022年11月12日
0 收藏 991 点赞 3,919 浏览 2365 个字

原文: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易如反掌,要是你想要自己实现。那等着哭吧,每个类都得改了。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,487
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289