C++ 类管理器-内存池?

C++ 类管理器-内存池?,c++,memory-management,C++,Memory Management,所以现在我有一些类似的东西(过于简单化): …如果我需要更多的人,我会调整memoryPool的大小。同样,这只是我计划制作的一个非常简化的版本。我只有一堆这样的对象,每个对象都有一个对象管理器,为每个对象管理器都有一个内存池可能会更有效,而不是动态创建每个单独的对象(可能有数百个) 这是一个更好的方法吗?谢谢。一般来说,这种方法有优点吗?也许。在你匆忙实施之前,问问自己为什么要这么做?性能分析是否指出了您要消除的热点?您是否试图将内存分配移出关键部分 请记住,与此相关的是成本,而不仅仅是运行时

所以现在我有一些类似的东西(过于简单化):

…如果我需要更多的人,我会调整memoryPool的大小。同样,这只是我计划制作的一个非常简化的版本。我只有一堆这样的对象,每个对象都有一个对象管理器,为每个对象管理器都有一个内存池可能会更有效,而不是动态创建每个单独的对象(可能有数百个)


这是一个更好的方法吗?谢谢。

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


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

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

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

另外,您可能需要考虑对已分配对象的重用,即在不再需要的情况下重用人实例。这将使您无需分配更多对象


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

您可以使用std::vector吗?我相信vector类已经有了一个很好的内存分配算法。在第二个
DEFAULT\u COUNT中,
Person
类的构造函数将在
init
中调用。但在第一个函数中,在
create
函数中只调用一个构造函数。您省略了重新分配数组所需的代码。这本身就是不这样做的一个很好的理由。您不太可能看到差异,现在的堆实现已经非常好了,不要吝啬于重要的东西,比如确保从多个线程分配不会带来麻烦。
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);
    }
};