关于malloc返回值的问题?
malloc在分配内存时实际上是调用了brk系统调用,我想问下为什么malloc返回的值要比brk多16个字节(64位环境下),有大神知道吗?
这个问题应该是在 linux 下申请了 N 字节,实际返回 N+16 字节,为什么会出现这种情况?
实际的原因就是Linux早期系统中不少代码存在越界bug, 就是计算长度的时候,大于等于还是大于的选择(或者小于 还是小于等于 就不用申请内存),决定申请malloc /realloc 的时机,然后早期很多程序员经常写错,导致越界崩溃,这种越界 bug 如此的频繁,如此的难查, Linux 早期为了避免这种低级程序bug, 保证一大批有 bug 的程序也可以稳定运行,工程上的临时解决办法就是malloc 故意多分配几个字节,就可以避免此越界问题,不用改一行代码,就可以解决几乎所有的越界bug, 这个就是工程上的一种妥协的手段。
早期是多分配8字节。现在c++委员会一般建议是 malloc 分配的内存尽量16字节对齐,方便 SSE 指令的大规模应用,一些版本会多分配16字节。
经过多年的积累,现在Linux的各种程序的代码质量已经很高了,没有那么多越界bug 了, 其实多数情况下不多分配几个字节的内存,也可以稳定运行了,因此,很多 Linux 第三方内存分配库,已经按实际内存申请量分配内存了,不再多分配几字节了, 毕竟以前多分配几字节也是一种资源的浪费。
下面是Linux 操作系统默认的Ptmalloc的malloc()后执行malloc_usable_size()的返回结果,可以看到每个内存申请都多分配了几个字节
下面是Google tcmalloc库的malloc()后执行malloc_usable_size()的返回结果,可以看到每个内存申请都刚好适配
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/97109.html