本文所讲的Memory Pool为C语言实现,旨在让大家都能看懂,看明白(至少能够完全理解本文所讲的Memory Pool的实现原理)。 概念 首先,我们介绍下什么是内存池? 预先在内存中申请一定数量的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存返回,在释放的时候,将内存返回给内存池而不是OS,在下次申请的时候,重新进行分配 那么
typedefstructMemoryBlock{void*data;//内存块起始地址structMemoryBlock *next;//下一个内存块的地址}MemoryBlock; 内存池结构 typedefstructMemoryPool{ MemoryBlock*freeList;//空闲内存块链表MemoryBlock *usedList;//占用内存块链表intfreeCount;//空闲内存块数量intusedCount;//占用内存块数量intblockCount;//内存...
= NULL) { printf("第%d块large block size=%d\n", i, large->size); } } printf("\r\n\r\n---stop monitor poll---\r\n\r\n"); } int main() { struct mp_pool_s *p = mp_create_pool(PAGE_SIZE); monitor_mp_poll(p, "create memory pool"); #if 0 printf("mp_align(5,...
但是舍弃了内存分配的动态性,性能的优劣其实还是取决于它一个unit size设置,只能说在某些情况下更优,但是如果size设置太大,会造成过多碎片浪费内存,size太小,双向链表分配的速度也不见得快于动态空闲链表。思路是可以的,更优的做法是同时弄多个不同unit size的池子,根据数据的大小选泽池子 ...
不管具体的分配算法是怎样的,为了减少系统调用,减少物理内存碎片,malloc() 的整体思想是先向操作系统申请一块大小适当的内存,然后自己管理,这就是内存池(Memory Pool)。 内存池的研究重点不是向操作系统申请内存,而是对已申请到的内存的管理,这涉及到非常复杂的算法,是一个永远也研究不完的课题,除了C标准库自带的...
3.内存池:内存池是一种优化技术,它通过预先分配一块固定大小的内存块,然后在程序运行期间重复使用这些内存块,避免了频繁的动态内存分配和释放操作。以下是一个简单的内存池实现示例:在这个例子中,createMemoryPool函数创建一个指定大小和数量的内存池。allocateFromMemoryPool函数从内存池中分配一块内存,并返回指针...
memoryPool[POOL_SIZE];void memoryPoolAllocation() { MemoryBlock *block = &memoryPool[0]; // 从内存池中分配内存 block->data = 40; printf("Memory pool variable: %d\n", block->data); // 不需要释放,内存池中的内存可以被多次重复利用}int main() { memoryPoolAllocation...
memoryNode_t memPool[MEMORY_POOL_SIZE];/*MEMORY_POOL_SIZE=64*/ }; 1. 2. 3. 4. 5. 6. 内存节点结构 typedef struct node{ int data; }memoryNode_t; 1. 2. 3. 该数据结构可根据需求自己实现。 内存池实现逻辑如下: 定义一个内存池结构信息的全局变量struct memoryPool *G_memPool ...
//uint32_t max_size;//最大memory使用 //uint32_t blocknum; }; //create and init struct memheap,返回memheap指针 void*memheap_init(uint32_t chunksize,uint32_t initsize,uint32_t growsize); //destruct memheap voidmemheap_dealloc(structmemheap*pool); ...
13. } MemoryPool; typedef struct _memory_pool { unsigned int blockCount;//申请块数量 unsigned int blockCountStep;//内存块数增长步长 unsigned int blockSize;//单个块的大小 unsigned int freeCount;//空闲的内存块数 MemoryBlock *freeHead; //空闲的头 MemoryBlock *freeTail; //空闲的尾 MemoryBloc...