班长 - 内存池?

时间:2013-05-22 17:35:27

标签: c++ memory-management

所以现在我有这样的事情(过度简化):

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的大小。再次,只是我计划制作它的一个非常简化的版本。我只有一堆这些对象和每个对象的对象管理器,为每个对象管理器创建一个内存池可能更有效,而不是动态创建每个单独的对象(可能有数百个)。

这会是一种更好的方法吗?感谢。

2 个答案:

答案 0 :(得分:2)

第二种方法肯定更有效率。与分配大量对象相比,每个单个对象的分配成本很高。

您的代码示例中缺少的是在管理器的create函数中处理池的耗尽(可能是由于代码示例的过度简化)。

此外,您可能希望考虑重用已分配的对象,即在不再需要时重用Person实例。这将使您无需分配更多对象。

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

答案 1 :(得分:0)

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

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