Linux_UNIX编程手册-读书笔记-第七章(内存分配)

7.1 在堆上分配内存

所谓堆是一段长度可变的连续虚拟内存,始于进程未初始化数据段的末尾,随着内存的分配和释放而增减。
通常将堆的当前内存边界称为"program break".

brk 和sbrk
这两个函数的作用就是通过设置program break 的位置改变堆的大小。
函数原型:在这里插入图片描述
但是在实际代码中很少使用这些系统调用,但是了解他们有助于弄清内存分配的工作过程。

brk()会将program break设置为参数end_data_segment所指定的位置
sbrk()会将program break在原有地址上增加从参数increment传入的大小

malloc()和free()
在这里插入图片描述
在这里插入图片描述
free()并不降低program break的位置,而是将这块内存添加到空闲内存列表中。
free(NULL)将什么都不做。
free()函数会在释放内存时将相邻的空闲内存块合并为一整块更大的内存。

malloc的实现:
首先扫描之前由free所释放的空闲内存块列表,以求找到尺寸大于或等于要求的一块内存空间。
如果找不到合适的空闲内存块,malloc会调用sbrk()分配更多的内存(以虚拟内存页大小的数倍)。
free的实现:
将内存块置于空闲内存列表中。

calloc()和realloc()
calloc(): 用于分配size个numitems大小的数据
realloc(): 用于调整一块内存的大小

分配对齐的内存:
在这里插入图片描述
分配size个字节,起始地址是boundary的整数倍,而boundary必须是2的整数次幂。
posix_memalign感觉没啥用就没看。。

7.2 在堆栈上分配内存:alloca()

在这里插入图片描述

  • alloca通过增加栈帧的大小从堆栈上分配内存。
  • 同时,alloca可能造成内存溢出。
  • 注意:不能在一个函数的参数列表中调用alloca().

使用alloca()来分配内存相对于malloc的优势:

  1. alloca()的速度快于malloc()
  2. alloca()分配的内存会随帧栈的移除而自动释放,及超过生命周期时。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值