类管理器-内存池
Class manager - memory pool?
现在我有这样的内容(过于简化):
class Person
{
unsigned int ID:
........
};
class ClassManager
{
std::vector<Person*> _Persons;
Person* create()
{
Person* person = new Person();
unsigned int id = _Persons.size();
person->ID = id;
_Persons.push_back(person);
}
Person* get(unsigned int ID)
{
return _Persions[ID];
}
};
我想知道这样做是否会更有效率:
class ClassManager
{
static const unsigned int DEFAULT_COUNT = 4
Person* memoryPool;
unsigned int count;
unsigned int index;
void init()
{
memoryPool = new Person[DEFAULT_COUNT];
count = DEFAULT_COUNT;
index = 0;
}
Person* create()
{
Person* person = &memoryPool[index];
person->ID = index;
index += 1;
return person;
}
Person* get(unsigned int ID)
{
return &memoryPool(ID);
}
};
…然后我只要调整memoryPool的大小,如果我需要更多的person。同样,这只是我计划制作的一个非常简化的版本。我只有一堆这样的对象和每个对象的对象管理器,为每个对象管理器设置一个内存池可能更有效,而不是动态地创建每个单独的对象(可能有数百个)。
这是一个更好的方法吗?谢谢。
第二种方法当然更有效。与分配大量对象相比,分配单个对象的成本更高。
代码示例中缺少的是在管理器的create函数中处理池耗尽(可能是由于代码示例过于简化)。
此外,您可能需要考虑重用已分配的对象,即在不再需要Person实例时重用它们。这将为您节省分配更多对象的需要。
考虑为抽象对象的内存池使用模板类,并在每个对象管理器中嵌入这样的池类——为该管理器的对象类型实例化。一旦对象不再需要,就应该将其返回给管理器并将其返回到池中以供重用。
一般来说,这种方法有优点吗?也许。在你急于实施之前,问问你自己为什么要这么做?性能分析是否指出了您试图消除的热点?您是否试图将内存分配移出临界区?
请记住,与此相关的成本不仅仅是您可以量化的运行时性能。这是以必须编写、调试和维护的代码行为单位的成本。
相关文章:
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 这个用于地图的参考计数内存管理器的概念好吗?
- 如何使 c++ 修饰器模式更易于用于内存管理
- 用C++替换内存管理器的单例解决方案
- 用于 SDL 纹理的内存高效资源管理器
- 将全局新与自定义内存管理器结合使用
- 内存管理器-访问冲突写入位置异常
- --带有用于mpi编译的内存管理器=none标志
- 在具有动态大小内存池的多线程C/C++中实现内存管理器
- 在自定义内存管理器中使用矢量
- 删除对象时C++自定义内存管理器错误
- 在内存管理器中分配数组
- 尝试使用while循环取消分配向量,任务管理器显示内存使用正在增加
- 操作符new已在带有库的自定义内存管理器中定义
- 我们为什么要使用内存管理器
- 在c++中实现共享内存管理器
- Qt中的智能指针内存管理器
- 管理预分配块的内存管理器
- 自定义内存管理器抽象