运行时数据结构-段

 

首先看一下编译完成后的可执行文件a.out的段在内存中的布局:


运行时数据结构有好几种,包括堆栈,活动记录(activation record)、数据、堆等。

堆栈主要有三个用途:

1. 堆栈为函数内部声明的局部变量(automic variable,自动变量)提供存储空间;

2. 进行函数调用时,堆栈存储与此有关的一些维护信息,即活动记录

3. 堆栈也可以被用作暂存储区。有时候程序需要一些临时存储,如计算一个很长的表达式时,可以把部分结果先压到堆栈中,当需要时再把它从堆栈中取出。通过alloca()函数分配的内存就是位于堆栈中(因此alloca可以避免内存泄漏)。

过程活动记录的结构:

setjmp( jmp_buf j )和longjmp( jmp_buf j, int i)就是通过操纵过程活动记录实现的。 setjmp保存了一份程序的计数器和当前的栈顶指针,longjmp恢复这些值,有效地转移控制并把状态重置回保存状态的时候。

数据段和堆

BBS段和数据段可以合起来统称为数据段,BBS段和数据段一样,用于存储全局变量及静态变量,而BBS段只是有效地减少了可执行文件占用的空间(在可执行文件中,BBS段只是记录了需要多少空间,在运行的时候,在进程地址空间内为其分配相应的内存)。

就像堆栈段能够根据需要自动增长一样,数据段也包含了一个对象,用于完成这项工作,这就是堆(heap)。堆区域用于动态分配的存储,也就是通过malloc(或calloc, realloc)函数获得的内存,并通过指针访问。堆中的所有东西都是匿名的——不能按名字直接访问,只能通过指针间接访问。被分配的内存总是经过对齐,所以一般malloc的内存大小通常被圆整为2的乘方。回收的内存可供程序重新使用,但并不还给操作系统。(要想获得以后能够返回给系统内核的内存,可以使用mmap系统调用来映射/dev/zero文件,用munmap系统调用返回内存)

堆的末端用一个称为break的指针来标识。当堆管理器需要更多内存的时候,它可以通过系统调用brk和sbrk来移动break指针,sbrk向进程提供了惟一的方法将数据段内存返回给系统内核。用于内存管理的调用是:

malloc和free —— 从堆中获得内存以及把内存返还给堆

brk和sbrk —— 调整数据段的大小至一个绝对值(通过某个增量)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值