标签:内存
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。
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
标签:内存
原文地址:http://blog.csdn.net/csuhoward/article/details/25892783