C++静态内存池
为何需要内存池
在我们为对象分配内存时,我们的编译器会自动在对象对应的内存上下各分配一个cookie,用来描述对象的大小信息,方便我们进行释放。
在我们大量进行内存分配是时候,过多的这些cookies会影响我们的性能。所以,我们希望对于一种对象,我们先分配一大块紧凑的内存(chunk),然后将大量的同种对象存储在这大块内存chunk中。每次需要一个这种对象时,我们不需要再次new一个(这样会创建新的cookie),而是直接从之前申请的那个大块内存中拿就可以。这样,我们就避开了cookie。这个大块的内存,就是我们的“池”。
如何实现内存池
我们申请了chunk之后,需要将其分割成一个个小块来分别存储每一个对象,而每个小块的大小需要可以容纳该对象。在实现时,我们通常根据具体应用场景以及经验,手动指定小块的大小。
每一个空闲的,未分配的小块之间使用单链表进行连接。每个小块就是单链表的一个节点node。当将这个小块被使用到时,就将它移除链表。回收时,将它重新加入链表。
#ifndef _StaticAllocator
#define _StaticAllocator
#include <iostream>
#include <cstddef> // for std::size_t
#include <new> // for std::bad_alloc
class StaticAllocator {
public:
static constexpr std::size_t POOL_SIZE = 1