免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1898 | 回复: 7
打印 上一主题 下一主题

[Linux] malloc前十六个字节中怎么体现分配内存大小的 [复制链接]

论坛徽章:
1
戌狗
日期:2014-11-27 09:53:29
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-11 15:15 |只看该作者 |倒序浏览
rt。知道编译器在分配内存时,前面预留了16个字节(这是win下,linux下应该一样)。
编译器在分配内存时,分配给用户的地址减去16个字节,保存了分配内存的类型与大小
vs调试时发现如下规律
【1】第一顺序的四个字节代表分配内存大小(注意是单位数,而非内存总字节数),并以小端(跟cpu有关)方式呈现,在32位处理器或者32位操作系统下,程序所能允许分配最大内存为2^32次幂;
【2】第二顺序的四个字节不清楚代表什么
【3】第三顺序的四个字节代表分配数据类型,猜测
    7a--char
    7b--short
    7c--int
    7d--long
    7e--float
    7f--double
【4】第四顺序的四个字节都为fd,猜测默认为保留字节
疑问:如何从上面的资料计算申请分配内存的大小
所分配内存个数在第一顺序的四个字节中有体现,但是所分配内存的单个单元大小几何单从第三顺序的四个字节看不出所以然。再分析下第三顺序的四个字节,对应【总结3】,略加分析,会发现单个单元大小也对应了某个值。我试了下不同结构体对应的值也各不一样。猜测vs编译器对其单个单元值在编译时进行了计算,以便于在释放内存时清楚该释放内存大小,但是不知道是否是有规律的。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2014-12-12 16:35 |只看该作者
shiqgnefu 发表于 2014-12-11 15:15
rt。知道编译器在分配内存时,前面预留了16个字节(这是win下,linux下应该一样)。


严重怀疑。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
3 [报告]
发表于 2014-12-12 17:17 |只看该作者
楼主这东西是从哪看到的?书上还是网上?

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
4 [报告]
发表于 2014-12-12 17:20 |只看该作者
我记得malloc分配的时候,前面会预留出4个字节(具体是几个字节不确定),用于标记这块内存的长度,在free的时候使用

论坛徽章:
1
戌狗
日期:2014-11-27 09:53:29
5 [报告]
发表于 2014-12-15 10:29 |只看该作者
回复 2# MMMIX


    你的怀疑是正确的,试了,gcc跟vs不一样

论坛徽章:
1
戌狗
日期:2014-11-27 09:53:29
6 [报告]
发表于 2014-12-15 10:29 |只看该作者
回复 3# super皮波

忘了,瞎看,然后用vs调试跟踪。gcc跟vs不一样,不知道其怎么管理内存的
   

论坛徽章:
1
戌狗
日期:2014-11-27 09:53:29
7
发表于 2014-12-15 10:31
回复 4# super皮波

我用gdb调试gcc编译程序发现也不是使用内存地址前4个字节
   

论坛徽章:
1
戌狗
日期:2014-11-27 09:53:29
8 [报告]
发表于 2014-12-16 16:23 |只看该作者
已经找到glibc下相关资料,glibc在分配内存前增加了一个 HEADER_SIZE ,跟踪malloc函数实现可以发现
typedef struct header {
  long check;
  union {
    struct header *next;
    struct free_list *fl;
  } u;
} *header_t;

#define HEADER_SIZE sizeof (struct header)

typedef struct free_list {
spin_lock_t lock;        /* spin lock for mutual exclusion */
header_t head;         /* head of free list for this size */
#ifdef        DEBUG
int in_use;         /* # mallocs - # frees */
#endif        /* DEBUG */
} *free_list_t;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP