OGRE中对象的内存分配[转]

如果看OGRE代码比较深入的话,你会发现在OGRE里定义的每一个类几乎都继承一个类似***Alloc的基类。例如类ConfigFile类继承自ConfigAlloc、类Root继承自RootAlloc等等。其实如果你打开OgreMemoryAllocatorConfig.h文件仔细看看就会发现,这些所谓千奇百怪的Alloc类其实都是一样的,都是继承自相同的类——StdAllocPolicy,只是作者编造了很多额外的名字拿来忽悠读者的。

     类StdAllocPolicy的主要工作其实说起来非常简单(但这非常简单的东东就屠杀了我几天的时间才弄得比较明白),主要负责operator new和operator delete的重载的工作,因为以前自己写代码的时候也没有做过operator new的重载工作,都是使用默认的内存分配的功能,所以对默认的new优缺点一无所知,从网上的一些资料的显示也没有非常详细的讲解,只是有两点是比较有说服力的:一、通常默认的分配器速度极慢,而且分配小型对象是空间浪费严重。二、默认的分配失败时会抛出异常。以我的个人观点来说,OGRE之所以要重载new和delete的原因是基于上面所说的第二点,或许它不想使用默认的异常机制。

    下面是扫盲:区分三种不同的new:

     new操作符:通常我们定义一个对象的时候A *a = new A调用的就是这个操作符,它是由语言内建,不能重载,不能改变其行为。

     operator new:operator new是一个函数,void * operator new(size_t size)。它分配指定大小的内存,可以被重载,可以添加额外的参数,但第一个参数必须为size_t。

     placement new:placement new在以块指定的内存上使用构造函数。关于placement new的解释我在上一篇文章也有了论述,可以参考一下。

     当我们重载了new而不想用默认的new时,最简单的做法是在new后面加上一个括号,例如我们类A里重载了new,只需要以下形式就可以了:A *a = new() A,而此时你写成A *a = new A是不同的,它调用的是默认的new。

     回到OGRE里面,你会发现通常定义一个对象都是A *a = OGRE_NEW A的形式,而OGRE_NEW的定义如下:

#define OGRE_NEW new((),(),())

    和上面讲的保持一致,调用是重载的new。

    好了,先写这么多了,再深入的理论要更加深入的研读才能发言,希望这些知识对大家有用!

转自:http://blog.csdn.net/HermanOpenGL/archive/2009/01/24/3852600.aspx

你可能感兴趣的:(OGRE中对象的内存分配[转])