美文网首页不懂的知识点
iOS面试题:c中,malloc对象,传入了size,free只

iOS面试题:c中,malloc对象,传入了size,free只

作者: iOS猿_员 | 来源:发表于2019-01-26 15:38 被阅读982次

    原文:iOS面试题大全

    总体上说,ptmalloc的内存管理是基于内存池的,而它的内存来源有两种:
    1 通过brk()获得
    2 通过mmap()匿名映射获得

    当用户向ptmalloc请求内存时:
    1 首先查找定长内存分配池,如果查找到则返回
    2 如果没有空闲内存可供使用,则向操作系统申请一块64Mb的内存,从中切出用户需要的内存,返回

    当用户调用free释放内存时:
    1 直接将内存放入适当的定长内存池队列
    2 如果触发了一定的条件,则将所有空闲内存合并,如果满足释放条件,将内存全部还给操作系统

    当然了,上面的描述中省略了太多的细节。比如什么时候走brk什么时候走mmap, 再比如当请求的内存大于一个阙值时,ptmalloc将会变成一个mmap的简单封装,还有触发内存归还操作系统的条件等等。
    不过已经足够回答题目中的问题了:因为malloc的时候记录了大小。
    这里还可以得出另一个结论:由于malloc的时候记录了大量的状态,所以在频繁使用malloc分配小内存时,会造成大量的内存浪费。举例来说,当反复malloc(1)时,每一次分配的内存在32字节:包括size of previous chunk,size of chunk,bk_chunk_pointer,fd_chunk_pointer共4个指针,合计4 * 8 = 32字节....

    相关文章

      网友评论

        本文标题:iOS面试题:c中,malloc对象,传入了size,free只

        本文链接:https://www.haomeiwen.com/subject/viuijqtx.html