内存池是一种内存分配方式,它预先在内存中分配一定数量的块或对象,形成一个“池”。当程序需要分配内存时,它从这个池中分配一个块;当内存被释放时,这个块返回到池中以供再次使用。内存池可以显著减少频繁分配和释放内存所带来的开销,并且有助于避免内存碎片化,提高内存使用效率。
下面展示了如何设计一个简单的内存池,这个简单的内存池设计包括以下几个关键特性:
- 预分配:在构造函数中预先分配了一定数量的固定大小内存块。
- 分配与释放:
allocate
方法从池中分配一个内存块,而deallocate
方法则将不再使用的内存块返还给池。 - 管理策略:本例中使用
std::list
来管理空闲内存块,但实际应用中可能需考虑更高效的数据结构。
#include <iostream>
#include <list>
class MemoryPool {
public:
MemoryPool(size_t size, unsigned int count) {
for (unsigned int i = 0; i < count; ++i) {
freeBlocks.push_back(new char[size]);
}
blockSize = size;
}
~MemoryPool() {
for (auto block : freeBlocks) {
delete[] block;
}
}
void* allocate() {
if (freeBlocks.empty()) {
throw std::bad_alloc();
}
char* block = freeBlocks.front();
freeBlocks.pop_front();
return block;
}
void deallocate(void* block) {
freeBlocks.push_back(static_cast<char*>(block));
}
private:
std::list<char*> freeBlocks;
size_t blockSize;
};
// 使用示例
int main() {
const int blockSize = 32; // 块大小
const int blockCount = 10; // 块数量
MemoryPool pool(blockSize, blockCount);
// 分配内存
void* ptr1 = pool.allocate();
void* ptr2 = pool.allocate();
// 使用ptr1和ptr2...
// 释放内存
pool.deallocate(ptr1);
pool.deallocate(ptr2);
return 0;
}