malloc

在内存的动态存储区中分配一定长度的连续空间,返回一个指向所分配的连续存储空间的起始地址的指针;动态分配是在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法;动态内存分配不像数组等静态内存分配方法那样预先分配存储空间,而是由系统根据程序的需要即时分配,而且分配的大小是程序要求的大小

malloc库函数的参数是一个无符号整型,当函数没有成功分配存储空间的时候,就会返回一个NULL指针,因此在调用该函数时检查返回值是否为NULL并执行相应操作

虽然这里的额存储块是通过动态分配得到的,但是它的大小也是确定的,不允许越界使用,也就是根据程序中分配的存储空间,使用就必须在这个范围内进行

下面这个工作机制摘抄自上海交大计算机一位哥们:

malloc函数的实质体现在,它有一个将可用的内存块连接成为一个长长的列表的所谓空闲链表,调用malloc时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块,然后将内存块一分为二,一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节,接下来将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上;调用free函数时,它将用户释放的内存块连接到空闲链上,到最后,空闲链会被切成很多的小内存片段,如果这时候用户申请了一个大的内存片段,那么空闲链上可能没有可以满足用户栩雅哦的片段了,于是malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块

malloc_init是初始化内存分配程序的函数。它主要完成:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针

如果还想更深了解malloc的机理,就只有查看其实现的流程以及内存分配管理源代码了。还有一点多次调用malloc后空闲内存被切成很多个小内存片段,这就使得用户在申请内存使用时,由于找不到足够大的内存空间,malloc需要进行内存整理,使得函数的性能越来越低,可以通过总是分配大小为2的幂的内存块,而最大限度降低潜在的malloc性能丧失,最大限度见少了进入空闲链的怪异片段(各种尺寸的小片段都有)的数量,尽管看起来这好像浪费了空间,但是永远不会超过50%

发表评论