泛型 C++ 类的对象池
实现适用于泛型 C++ 对象的简单对象池方案。
引言
默认内存分配器在频繁的 new
和 delete
操作方面效率不高。 有许多通用的分配器可以替代标准的分配器。 在某些情况下,您希望以牺牲更多内存为代价来提高性能。 这对于在密集型应用程序中频繁创建和销毁的小对象尤其如此。 因此,我决定创建一个类来池化类的实例,以便 new
和 delete
在已经存在的对象数组上工作。
用法
要为类启用池化,您可以公开继承自该类,如下所示
class myclasstobepooled : public ObjectPool< myclasstobepooled >
在创建任何对象之前调用此函数
myclasstobepooled::initialize();
在删除所有对象之后调用此函数
myclasstobepooled::finalize();
实现
ObjectPool
类维护一个静态的模板类型指针向量。 重载的 new
和 delete
运算符管理该列表。
可以选择启用或禁用线程安全性。 这样可以排除关键部分调用,如果该类在单线程环境中使用,或者如果 new
和 delete
操作始终从同一线程执行。
您可以通过注释该行来禁用多线程支持
#define ___USE_MT___
即使使用放置 new
和 delete
,构造函数和析构函数也会被调用。 因此,无需编写特殊代码来调用构造函数和析构函数。
附加信息
最初,我考虑使用 malloc
分配内存,并手动调用构造函数和析构函数。 但这将类似于通用内存分配器,其中全局 new
和 delete
被重载。
假设您有一个类 myclass
。
// allocate myclass* p = malloc(sizeof(myclass)); // call the constructor, does not allocate any memory new (p) myclass(); // call the destructor manually p->~myclass();
结论
如果您有一个类,您在代码的关键性能部分频繁地 new
和 delete
,那么使用该类可以获得显着的好处。
下载次数
该类的非 STL 版本可在下载部分获得。 这是由 Christian Kaiser 提供的。