FreeList内存管理初步尝试

上次分析字体文件的时候,就考虑了要做个内存管理,读取文件时候的不断malloc,确实给效率带来极大的影响。这次初步尝试了freelist内存管理的设计,意识到了内存管理在整个数据结构设计中的作用。跟以前对比的话,以前设计数据结构只考虑其节点访问复杂度,而这次从整个系统耗时复杂度角度出发。

 

设计数据结构应该考虑三个方面,对象的创建和释放,对象的访问耗时,对象存储空间。

 

内存管理的本质是减少malloc,free次数。

 

所以从另一个角度看,内存管理的设计是和数据结构紧密结合的,也就是内存管理的设计其本质是数据结构的设计,freelist只是其中的一种方法,确切更好的内存管理应该结合实际创建和释放行为来考虑。

 

还有一点关于学习方法的,应该以一个开放,共享,交流的心态来处理,才进步得最快。在这次内存管理的初步接触中,只是稍微看了下相关资料后,大部分是和重哥讨论中觉悟出来,打通了这块的经脉,有了个概念,处理起来得心应手。

 

下面是一小块代码,留个纪念。

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存管理系统是操作系统的一部分,主要负责为应用程序分配和管理内存。以下是一个简单的 C++ 内存管理系统的实现,它使用了链表来存储空闲内存块。 ```c++ #include <iostream> #include <cstdlib> using namespace std; struct MemoryBlock { int size; MemoryBlock* next; }; class MemoryManager { private: MemoryBlock* freeList; public: MemoryManager(int size) { freeList = (MemoryBlock*) malloc(size); freeList->size = size - sizeof(MemoryBlock); freeList->next = NULL; } ~MemoryManager() { free(freeList); } void* allocate(int size) { MemoryBlock* p = freeList; MemoryBlock* prev = NULL; while (p != NULL) { if (p->size >= size) { if (p->size == size) { if (prev == NULL) { freeList = p->next; } else { prev->next = p->next; } } else { MemoryBlock* newBlock = (MemoryBlock*) ((char*) p + sizeof(MemoryBlock) + size); newBlock->size = p->size - size - sizeof(MemoryBlock); newBlock->next = p->next; if (prev == NULL) { freeList = newBlock; } else { prev->next = newBlock; } } return (void*) ((char*) p + sizeof(MemoryBlock)); } prev = p; p = p->next; } return NULL; } void deallocate(void* ptr, int size) { MemoryBlock* p = (MemoryBlock*) ((char*) ptr - sizeof(MemoryBlock)); MemoryBlock* prev = NULL; MemoryBlock* curr = freeList; while (curr != NULL && curr < p) { prev = curr; curr = curr->next; } if (prev == NULL) { freeList = p; } else { prev->next = p; } p->next = curr; if (curr != NULL && (char*) p + p->size + sizeof(MemoryBlock) == (char*) curr) { p->size += curr->size + sizeof(MemoryBlock); p->next = curr->next; } if (prev != NULL && (char*) prev + prev->size + sizeof(MemoryBlock) == (char*) p) { prev->size += p->size + sizeof(MemoryBlock); prev->next = p->next; } } void print() { MemoryBlock* p = freeList; while (p != NULL) { cout << "Memory block size: " << p->size << endl; p = p->next; } } }; int main() { MemoryManager mm(1024); int* p1 = (int*) mm.allocate(sizeof(int)); *p1 = 100; int* p2 = (int*) mm.allocate(sizeof(int)); *p2 = 200; int* p3 = (int*) mm.allocate(sizeof(int)); *p3 = 300; mm.deallocate(p1, sizeof(int)); mm.deallocate(p3, sizeof(int)); mm.print(); return 0; } ``` 该内存管理系统使用 `MemoryBlock` 结构体来表示空闲内存块,其中包含了块的大小和下一个空闲块的指针。`MemoryManager` 类维护了一个空闲块链表,当需要分配内存时,它会遍历链表,查找可用空间。如果找到了一个合适的块,则从链表中移除它,并返回指向实际内存块的指针。当需要释放内存时,它会将内存块添加到链表中,并合并相邻的空闲块。最后,`print()` 函数用于打印当前的空闲块列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值