c++中的malloc底层实现代码
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。
malloc底层实现
首先讲一下malloc这个函数
void* malloc(size_t size);
malloc是c里面的函数,调用时候需要显示的指定分配空间的大小,分配成功会返回
void *
的指针,需要自己进行强制转换,不安全,失败返回NULL相关函数
int brk(const void *addr)【c++中的malloc底层实现代码】函数是为了扩展heap的上界brk的。0成功 -1失败
void* sbrk(intprt_t incr)需要申请内存的大小并且返回heap新上届brk的地址
void *mmap(void *addr, size\_t length, int prot, int flags, int fd, off\_t offset);
函数是将磁盘文件映射到内存中,直接修改内存那么就可以操作DISK
注意这里分配的只是虚拟内存,只有当使用的使用产生缺页中断的时候由操作系统进行分配并建立映射
malloc分配规则
- 当申请小于
128k
内存的时候malloc会调用brk()
来进行内存的分配 - 当申请大于
128k
的内存的时候malloc会调用mmap()
来进行内存的分配
这时候还是会引发问题
就是当我们频发的调用malloc的时候,会调用上面函数中的一个,这些就会产生系统开销,同时也会产生大量的内存碎片。这时候就需要一个内存池帮助我们管理内存,减少内存碎片的产生
内存池
内存池其实就是小申请一大块内存作为heap区,然后把大块内存分成一块块小内存,当用户申请内存的时候,就直接分配一块合适的空闲块。采用隐式链表将多有的空闲内存块连接起来,每一个内存块里面都是连续的内存
文章图片
这里维持着16条链表,每条链表(双向链表)都维持不同的固定大小的内存块
到此这篇关于c++中的malloc底层实现代码的文章就介绍到这了,更多相关c++ malloc底层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- opencv|opencv C++模板匹配的简单实现
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗