【发布时间】:2017-01-01 23:18:42
【问题描述】:
所以,我一直在花一些时间在 C++ 中实现一个内存池类。除了一路上的一些小问题,一切都还算顺利。但是,当我今天尝试通过首先使用内存池分配 1000 个块然后将其与使用 new 进行比较来测试它时,我实际上在使用时接近了差三倍的性能(以纳秒为单位)内存池。我的分配方式是这样的:
template <class T> T* MemPool<T>::allocate()
{
Chunk<T>* tempChunk = _startChunk;
while (tempChunk->_free == false)
{
if (tempChunk->_nextChunk == NULL)
throw std::runtime_error("No available chunks");
tempChunk = tempChunk->_nextChunk;
}
tempChunk->_free = false;
return &tempChunk->object;
}
我从池中的第一个块开始,并在池的链表中进行搜索,直到找到一个空闲块,或者到达池的末尾。现在,池越大,搜索所需的时间就越长,因为搜索的时间复杂度为 O(n),其中 n 是池中的块数。
所以我很好奇是否有人对如何改进分配有任何想法?我最初的想法是使用两个链表,而不仅仅是一个,其中一个包含空闲块,另一个包含分配的块。当要分配一个新块时,我只需将第一个提到的链表中的第一个元素移动到分配的链表中。据我所知,这将消除在分配时进行任何搜索的需要,而只留下需要搜索以找到正确块的解除分配。
感谢任何想法,因为这是我第一次以这种方式直接使用记忆。谢谢!
【问题讨论】:
-
你的块大小都一样吗?
标签: c++ memory memory-management pool