全部代码
#pragma once
#include <new>
#include <cstdio>
namespace tinySTL {
// 4 = sizeof FreeList
union FreeList {
union FreeList* next;
char data[1];
};
// 为了便于管理,二级空间配置器在分配的时候都是以8的倍数对齐。也就是说
// 二级配置器会将任何小块内存的需求上调到8的倍数处(例如:要7个字节,会
// 给你分配8个字节。要9个字节,会给你16个字节), 尽管这样做有内碎片的问
// 题,但是对于我们管理来说却简单了不少。因为这样的话只要维护16个FreeList
// 就可以了,FreeList这16个结点分别管理大小为8, 16, 24, 32, 40, 48,
// 56, 64, 72, 80, 88, 86, 96, 104, 112, 120, 128字节大小的内存块就行
// 了。
enum {
ALIGN = 8,
};
enum {
MAXBytes = 128,
};
enum {
FREELISTS = 16,
};
using MALLOCALLOCFUN = void(*)();
template <int inst>
class MallocAllocTemplate { // 一级空间配置器
private:
static void* oomMalloc(size_t n); // malloc失败时调用,即oom为out of memory
static MALLOCALLOCFUN MallocAllocOomHandler; // 默认不处理
public:
static void* allocate(size_t n);
static void deallocate(void* p) { std::free(p); }
static MALLOCALLOCFUN SetMallocHandler(MALLOCALLOCFUN f); // OOM_malloc** 中回调你的freeMemor函数进而帮助os获得内存,使得malloc分配成功。
};
template<int inst>
MALLOCALLOCFUN MallocAllocTemplate<inst>::MallocAllocOomHandler = nullptr; // 默认不处理
template<int inst>
void* MallocAllocTemplate<inst>::oomMalloc(size_t n) {
MALLOCALLOCFUN myMallocHandler;
void* result;
while (true) {
myMallocHandler