首页 > 代码库 > malloc的小知识
malloc的小知识
1.malloc不是直接向操作系统申请,而是先由glibc内存管理器收到请求,其分配一段内存并把内存地址返回给用户。
2.对于返回的内存地址p,p-4这个地址记录了malloc空间的大小,这就是当你free时可以直接释放内存而不用指定大小的原因。
3.这个malloc回来的空间大小是8字节对齐的,也就是每次都是8的倍数。
4.对于p-4这里记录malloc空间大小不是空穴来风,而是因为他本身就是属于一个叫做malloc_chunk的数据结构的一部分,如下图
struct malloc_chunk{
INTERNAL_SIZE_T prev_szie;
INTERNAL_SIZE_T size;
标志位;
用户数据;
}
5.当运行
p = malloc(20); strcpy(p, "Hello,world");第一行定义了申请一个虚拟空间,第二行发生了页中断进一步申请了物理空间。
6.运行
printf("0x%x\n",*(p-4));得到0x19,去除3个的标志位的影响,得到0x18,真实申请的空间大小也就是24,由20个字节实现8字节对齐就可以计算出24。
7.标志位解释
p = 1 表示上一块正被使用 pre_size此时通常为0
p = 0 表示上一块空闲 pre_size通常为上一块的大小
M = 1 表示该内存块通过mmap分配,只有分配大块内存时才采用mmap,对应释放要采用munmap_chunk(),否则使用chunk_free()
M = 0 表示不是用mmap分配的。
8.malloc每次分配至少16字节,所以每次只分配1、2字节实际上会造成不必要的浪费。
by: p4inkiller
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。