C语言realloc背后的内存管理

malloc申请内存,但不初始化。
calloc申请内存,且初始化为0。
free释放内存。
realloc重新分配已经分配的内存空间,可以变小,也可以变大。

以前一直有一个疑问,realloc是不是经常失败?
其实,realloc失败时,malloc基本也会失败。
物理内存以一页4096Bytes为单位分配,经过多级内存映射为进程的虚拟内存地址。
当malloc 4096B时,比较好理解,就是映射了一块物理内存。
如果realloc它,怎么保证物理内存紧挨着的4096B也没被占用?
其实不用保证,malloc两个页内存时,虚拟地址连续,实际物理地址可能是交错分布在不同内存条上(往往是不同内存通道)。
而且,realloc失败,系统会重新找多块内存拼起来返回给用户,且之前的内存数据被自动拷贝到新分配的空间,对于用户来讲,这个是无感的。
用户只需要注意将realloc返回的值更新到所有用到的地方,或者最好只有一个指针对象存储这个地址。
另外:物理内存的强制分配可以调查numa、libnuma等,github上搜索numa即可。

注:以上理解都未进行实际代码验证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值