前言
对象池与内存池的设计思路大体相同,如果我们的程序需要对一个类的对象进行大规模的申请和释放,用内存池也没有问题。但是由于内存池的内存块大小可能会与对象的大小不一致,从而导致内存块的碎片相对较多,因此通过构建一个对象池,对某个类的对象的内存申请和释放进行管理。
那么考虑一下对象池和内存池的区别?
1、对象池管理的是某个类的对象的内存管理,内存池管理的是内存块。
2、内存池重载了全局的new/delete操作符,对象池要在它想要管理的类中重载new/delete操作符。那么,为了避免在编写每个类的代码都要重载new/delete操作符,因此提供一个基类来重载new/delete操作符,所有想通过对象池管理的类要继承与这个基类。
对象池基类
这个基类的目的就是重载new/delete操作符,并提供静态的创建对象/释放对象的功能,替代了内存池设计的MemoryMgr管理类。
一个trick:可以看到,这是一个模板类,模板参数是继承这个基类的派生类类型。也就是说,当有一个派生类继承它的时候,要显示的告诉这个基类的模板参数。从而在createObject()接口中去创建对象。
另一个trick: 创建对象接口是一个模板函数,而且是一个可变参数的模板函数。因为这个基类并不知道继承它的类的构造函数会显示的调用几个参数。
第三个trick: 在这个基类中,构建了一个私有且静态的对象池类的对象(有点绕口),比如说CELLObjectPool是对象池类,那么我们在这个基类中,构建了一个静态的CELLObjectPool对象。通过这个对象调用对象池的分配和释放方法。同时,每个继承这个基类的类,都拥有一个对象池。
C++11的新