纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

c++ malloc底层 c++中的malloc底层实现代码

黑猫爱小鹿   2021-07-28 我要评论
想了解c++中的malloc底层实现代码的相关内容吗,黑猫爱小鹿在本文为您仔细讲解c++ malloc底层的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c++,malloc底层,c++,malloc,下面大家一起来学习吧。

malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。

malloc底层实现

首先讲一下malloc这个函数

void* malloc(size_t size);

malloc是c里面的函数,调用时候需要显示的指定分配空间的大小,分配成功会返回void *的指针,需要自己进行强制转换,不安全,失败返回NULL

相关函数

int brk(const void *addr)

函数是为了扩展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()来进行内存的分配

这个原因是因为,brk()分配的内存只有当高地址的内存被释放了低地址的才能被释放。而mmap申请的内存是可以单独释放的

这时候还是会引发问题

就是当我们频发的调用malloc的时候,会调用上面函数中的一个,这些就会产生系统开销,同时也会产生大量的内存碎片。这时候就需要一个内存池帮助我们管理内存,减少内存碎片的产生

内存池

内存池其实就是小申请一大块内存作为heap区,然后把大块内存分成一块块小内存,当用户申请内存的时候,就直接分配一块合适的空闲块。采用隐式链表将多有的空闲内存块连接起来,每一个内存块里面都是连续的内存

这里维持着16条链表,每条链表(双向链表)都维持不同的固定大小的内存块


相关文章

猜您喜欢

  • MyBatis延迟加载与立即加载 MyBatis延迟加载与立即加载案例教程

    想了解MyBatis延迟加载与立即加载案例教程的相关内容吗,小小张自由—>张有博在本文为您仔细讲解MyBatis延迟加载与立即加载的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:MyBatis延迟加载,MyBatis立即加载,下面大家一起来学习吧。..
  • docker部署k8s 在docker中部署k8s的方法

    想了解在docker中部署k8s的方法的相关内容吗,一名路过的小码农啊在本文为您仔细讲解docker部署k8s的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:docker部署k8s,docker,k8s,下面大家一起来学习吧。..

网友评论

Copyright 2020 www.freefLashonLinegames.com 【木头下载】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式