65.9K
CodeProject 正在变化。 阅读更多。
Home

泛型 C++ 类的对象池

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.29/5 (19投票s)

2003年4月17日

CPOL

2分钟阅读

viewsIcon

80957

downloadIcon

2322

实现适用于泛型 C++ 对象的简单对象池方案。

引言

默认内存分配器在频繁的 newdelete 操作方面效率不高。 有许多通用的分配器可以替代标准的分配器。 在某些情况下,您希望以牺牲更多内存为代价来提高性能。 这对于在密集型应用程序中频繁创建和销毁的小对象尤其如此。 因此,我决定创建一个类来池化类的实例,以便 newdelete 在已经存在的对象数组上工作。

用法

要为类启用池化,您可以公开继承自该类,如下所示

class myclasstobepooled : public ObjectPool< myclasstobepooled >

在创建任何对象之前调用此函数

myclasstobepooled::initialize();

在删除所有对象之后调用此函数

myclasstobepooled::finalize();

实现

ObjectPool 类维护一个静态的模板类型指针向量。 重载的 newdelete 运算符管理该列表。

可以选择启用或禁用线程安全性。 这样可以排除关键部分调用,如果该类在单线程环境中使用,或者如果 newdelete 操作始终从同一线程执行。

您可以通过注释该行来禁用多线程支持

#define ___USE_MT___

即使使用放置 newdelete,构造函数和析构函数也会被调用。 因此,无需编写特殊代码来调用构造函数和析构函数。

附加信息

最初,我考虑使用 malloc 分配内存,并手动调用构造函数和析构函数。 但这将类似于通用内存分配器,其中全局 newdelete 被重载。

假设您有一个类 myclass

// allocate
myclass* p = malloc(sizeof(myclass));     

// call the constructor, does not allocate any memory
new (p) myclass(); 


// call the destructor manually
p->~myclass();

结论

如果您有一个类,您在代码的关键性能部分频繁地 newdelete,那么使用该类可以获得显着的好处。

下载次数

该类的非 STL 版本可在下载部分获得。 这是由 Christian Kaiser 提供的。

© . All rights reserved.