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

标签 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);
    }
};

....然后,如果我需要更多人,我只需调整内存池的大小。再说一次,这只是我计划制作的一个非常简化的版本。我只有一堆这样的对象和每个对象的对象管理器,为每个对象管理器拥有一个内存池可能比动态创建每个单独的对象(可能有数百个)更有效。

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

最佳答案

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

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

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

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

关于c++ - 类管理器-内存池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16698199/

相关文章:

c++ - 指针类成员和删除职责

Java HashMap 。它应该用于多少条最大记录?

ios - iOS 中收到内存压力通知(严重)

c++ - C/C++ - (void) 如何不用作参数?

c++ - 调试构建编译比发布慢得多

c++ - 优化对指针 vector 的 new 调用?

c++ - A* 寻路问题。编译,但行为异常

c++ - 删除指针的时间

c - 使用 max_align_t 存储一大块字节

c++ - 统计数学问题