C++ STL alloc.h

本文主要探讨C++ STL中关于内存管理的细节,通过分析alloc.h文件,揭示STL如何高效地进行内存分配和释放,帮助开发者更好地理解和利用C++的内存机制。
摘要由CSDN通过智能技术生成

全部代码

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值