Skip to content

Latest commit

 

History

History
67 lines (51 loc) · 1.96 KB

内存池是什么?在C++中如何设计一个简单的内存池?.md

File metadata and controls

67 lines (51 loc) · 1.96 KB

内存池是一种内存分配方式,它预先在内存中分配一定数量的块或对象,形成一个“池”。当程序需要分配内存时,它从这个池中分配一个块;当内存被释放时,这个块返回到池中以供再次使用。内存池可以显著减少频繁分配和释放内存所带来的开销,并且有助于避免内存碎片化,提高内存使用效率。

下面展示了如何设计一个简单的内存池,这个简单的内存池设计包括以下几个关键特性:

  • 预分配:在构造函数中预先分配了一定数量的固定大小内存块。
  • 分配与释放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;
}