码迷,mamicode.com
首页 > 其他好文 > 详细

malloc的小知识

时间:2014-05-15 18:20:25      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:内存

1.malloc不是直接向操作系统申请,而是先由glibc内存管理器收到请求,其分配一段内存并把内存地址返回给用户。

2.对于返回的内存地址p,p-4这个地址记录了malloc空间的大小,这就是当你free时可以直接释放内存而不用指定大小的原因。

3.这个malloc回来的空间大小是8字节对齐的,也就是每次都是8的倍数。

4.对于p-4这里记录malloc空间大小不是空穴来风,而是因为他本身就是属于一个叫做malloc_chunk的数据结构的一部分,如下图

bubuko.com,布布扣

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

malloc的小知识,布布扣,bubuko.com

malloc的小知识

标签:内存

原文地址:http://blog.csdn.net/csuhoward/article/details/25892783

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!