博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
malloc的小知识
阅读量:2496 次
发布时间:2019-05-11

本文共 718 字,大约阅读时间需要 2 分钟。

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

你可能感兴趣的文章
python-2:工欲善其事,必先利其器 修改jupyter保存文件目录(亲测)
查看>>
Python 环境搭建
查看>>
免费字典api ,查询汉字完整信息
查看>>
Flume协作框架
查看>>
基于数据库的事务消息解决分布式事务方案
查看>>
HDU 2461 Rectangles#容斥原理
查看>>
网口扫盲二:Mac与Phy组成原理的简单分析(转)
查看>>
使用最大似然法来求解线性模型(1)
查看>>
EF 从sqlserver2008 迁移到 2005出现的BUG
查看>>
架构-浅谈MySQL数据库优化
查看>>
jquery锚点连接划动滚动条,再也不用a标签name 了
查看>>
Apache JMeter--网站自动测试与性能测评
查看>>
信号与系统(中)
查看>>
【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用
查看>>
bash 快捷键
查看>>
检测登录按钮 ,回车即登录
查看>>
蓝桥杯-微生物增殖
查看>>
ansible for devops读书笔记第一章
查看>>
解决IE6下,给图片加上line-height属性不起作用的方法
查看>>
#10172. 「一本通 5.4 练习 1」涂抹果酱 题解
查看>>