malloc,calloc 和 realloc是应用层用于开辟内存的三个函数。
-
实现原理
malloc / calloc 函数的实现原理:它维护一个可用内存链表(即所谓空闲链表)。
调用时,它在该链表中寻找一个满足用户请求所需要的内存块,这样就会出现三种情况:
- 如果找到一块与用户请求所需要大小相同的内存块,那就将该块内存返还给用户。
- 如果找到一块比用户请求所需要大小更大的内存块,则将该内存块一分为二(一块的大小与用户申请的大小一样,另一块就是剩下的字节),将分配给用户的那块内存传递给用户,将剩下的另一块返还到链表上。用户使用完,调用free函数时,它将用户释放的内存块连接到链表上。这样就产生一个问题:使用到最后的时候,空闲链表会被切成很多的小内存片段。
- 如果这时用户申请一个大内存块,那么空闲链上可能没有满足用户要求的内存片段,于是malloc函数请求延时,开始检查空闲内存链表并进行整理,将相邻小空闲块合成较大的内存块。
realloc 是从堆空间上分配内存,当扩大一块内存空间时,realloc试图直接从现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平;如果后面的字节不够,那么就使用堆上第一个足够满足要求的自由空间块,现存的数据拷贝到新的位置上,而老块则放回堆空间,这句话传递的一个很重要的信息就是数据可能被移动。