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

 更新时间:2021年07月28日 09:41:06   作者:黑猫爱小鹿  
这篇文章主要介绍了c++中的malloc底层实现代码,包括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条链表,每条链表(双向链表)都维持不同的固定大小的内存块

到此这篇关于c++中的malloc底层实现代码的文章就介绍到这了,更多相关c++ malloc底层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 虚函数表-C++多态的实现原理解析

    虚函数表-C++多态的实现原理解析

    这篇文章主要介绍了虚函数表-C++多态的实现原理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Qt使用OpenGL实现绘制3D图形

    Qt使用OpenGL实现绘制3D图形

    OpenGL是一个跨平台的、用来渲染3D图形的标准API,Qt对OpenGL提供了强大的支持,所以本文就来和大家介绍一下Qt如何使用OpenGL实现绘制3D图形吧
    2023-10-10
  • C++实现的分布式游戏服务端引擎KBEngine详解

    C++实现的分布式游戏服务端引擎KBEngine详解

    这篇文章主要详细介绍了C++实现的分布式游戏服务端引擎KBEngine的概念以及使用方法,非常的实用,有需要的小伙伴可以参考下
    2015-03-03
  • C++中new的越界访问问题

    C++中new的越界访问问题

    越界访问指访问了不是程序申请的内存区域,比如申请了5个字节的char数组,结果读写数据的第六个元素,或者访问了释放后的内存等等。
    2016-04-04
  • C语言杨辉三角两种实现方法

    C语言杨辉三角两种实现方法

    大家好,本篇文章主要讲的是C语言杨辉三角两种实现方法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • CMakeList中自动编译protobuf文件过程

    CMakeList中自动编译protobuf文件过程

    这篇文章主要介绍了CMakeList中自动编译protobuf文件过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C语言实现餐饮管理与点餐系统

    C语言实现餐饮管理与点餐系统

    这篇文章主要为大家详细介绍了C语言实现餐饮管理与点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • C语言实现歌曲信息管理系统

    C语言实现歌曲信息管理系统

    这篇文章主要为大家详细介绍了C语言实现歌曲信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C语言中带头双向循环链表基本操作的实现详解

    C语言中带头双向循环链表基本操作的实现详解

    无头单向非循环链表结构简单,一般不会单独用来存数据。而带头双向循环链表的结构较为复杂,一般用在单独存储数据。本文将介绍带头双向循环链表的基本操作,需要的可以参考一下
    2022-11-11
  • C++获取文件哈希值(hash)和获取torrent(bt种子)磁力链接哈希值

    C++获取文件哈希值(hash)和获取torrent(bt种子)磁力链接哈希值

    这二个代码一个是获取文件哈希值的,另外一个是获取torrent文件磁力链接的哈希值
    2013-11-11

最新评论