读这个之前,强烈建议看一下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易如反掌,要是你想要自己实现。那等着哭吧,每个类都得改了。