malloc calloc realloc 等六个内存分配函数的总结 malloc: 分别由两个系统调用完成:brk和mmap 1、brk是将数据段(.data)的最高地址指针_edata往高地址推; 2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。 这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。 A.malloc小于128k的内存,使用brk分配内存,将_edata往高地址推; B.malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配. malloc分配的内存是连续的。 calloc: void* calloc (size_t num, size_t size); 在内存的动态存储区中分配num块长度为“size”字节的连续区域,返回首地址。 主要的不同是malloc不初始化分配的内存,calloc初始化已分配的内存为0。 其次是calloc返回的是一个数组,而malloc返回的是一个对象。 realloc: void * realloc ( void * ptr, size_t size ); 将p所指向的对象的大小改为size个字节,如果 ptr 指针是空指针,该函数的作用同 malloc; realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能。如果 size 的大小小于之前 malloc或 realloc 分配的大小,那么原来内存块的数据会丢失,只保留现有数据;如果 size 的大小大于之前 malloc或 realloc 分配的大小,那么将会分配一块新的大小的内存块。realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。 alloca: void *alloca (size_t size) 该函数是从栈空间中分配内存,因此在函数返回时会自动释放此空间。 内核内存分配函数: 在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,释放内存用的是kfree,vfree。 kmalloc: void *kmalloc(size_t size, int flags); 申请物理内存上一片连续的空间,且不对申请到的空间进行清零操作,申请到的内存依然存有原来使用的数据,因申请到的内存位于连续的一片物理地址空间上,所以函数返回的地址通过一定的偏移量即可对应到实际的物理内存空间。 优点:函数运行速度快,申请的空间在物理内存也连续 缺点:最大只能申请128KB的内存空间 vmalloc(): 相对于前面两个函数,此函数申请的的是虚拟内存空间中连续的地址,而实际对应在物理内存空间中的地址,则是不连续的地址空间,所以在一定程度上对申请到的内存空间访问速度会比前两个函数慢 优点:通过此函数可直接申请大于128KB的内存空间 缺点:函数申请到的内存在物理空间上处于不连续的状态,所以访问速度相对于前两个函数申请的内存空间会较慢 vmalloc() 分配的物理地址无需连续,而kmalloc() 确保页在物理上是连续的; kmalloc分配内存是基于slab,因此slab的一些特性包括着色,对齐等都具备,性能较好。物理地址和逻辑地址都是连续的。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/81321.html