类管理器-内存池

Class manager - memory pool?

本文关键字:内存 管理器      更新时间:2023-10-16

现在我有这样的内容(过于简化):

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实例时重用它们。这将为您节省分配更多对象的需要。

考虑为抽象对象的内存池使用模板类,并在每个对象管理器中嵌入这样的池类——为该管理器的对象类型实例化。一旦对象不再需要,就应该将其返回给管理器并将其返回到池中以供重用。

一般来说,这种方法有优点吗?也许。在你急于实施之前,问问你自己为什么要这么做?性能分析是否指出了您试图消除的热点?您是否试图将内存分配移出临界区?

请记住,与此相关的成本不仅仅是您可以量化的运行时性能。这是以必须编写、调试和维护的代码行为单位的成本。