假设我需要经常在堆上分配和删除对象(任意大小),如果没有删除这些对象,我会将其返回到以后重复使用的“池”吗?

它会通过减少堆分配/交易来给予好处,还是与内存分配器性能相比,它会更慢,因为“池”需要管理动态的指针集。

我的用例:假设我基于链接列表创建一个队列容器,并且该列表的每个节点都在堆上分配,因此每个调用push()和pop()和pop()都会分配和dealslocate node:

`

template <typename T> struct QueueNode {
    QueueNode<T>* next;
    T object;
}

template <typename T> class Queue {
    void push(T object) {
        QueueNode<T>* newNode = QueueNodePool<T>::get(); //get recycled node
        if(!newNode) {
            newNode = new QueueNode<T>(object);
        }
        // push newNode routine here..
    }
    T pop() {
        //pop routine here...
        QueueNodePool<T>::store(unusedNode); //recycle node
        return unusedNode->object;
    }
}

`

有帮助吗?

解决方案

合并是一种避免频繁分配和交易的非常常见的技术。一些 将其视为设计模式。通常存在现有的实现,因此重新发明车轮没有任何好处。

您可能想看看这个问题 对象池与动态分配

其他提示

当我问时,我也有类似的担忧 这个问题。 答案可能对您有见地,尤其是那些解决记忆分散的关注的答案。

你可能会看看 增强对象池 - 用于想法,参考或最佳 用法 :>

这是使内存分配更确定性的特别有用工具。如果您将生成池的大块进行预先分配,则它还可以减少内存碎片。

根据您的运行时库,您可能对许多情况进行“足够好”的分配。也就是说,如果您可以证明自己有特殊的用例或在LIBC中的Malloc实施不佳,则只能在池分配器中构建用于应用程序的池分配。

由于Doug Lea的大部分作品都存在于GNU LIB中,因此您可能想阅读他的经历 内存分配器.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top