Expert C Programming阅读笔记VI

Chapter 6 Poetry in Motion: Runtime Data Structures

a.out的缘由
a.out - assembler and link editor output format

Segments
UNIX的Segment和x86的Segment有着不同的含义。
UNIX:二进制文件中的一些相关数据在一起形成一个Segment。
x86:被分成64K地址空间的内存空间。

Unix中用size命令查看segment数据。

C中,没有初始化的全局变量和static变量被送在BSS段,而已经初始化的全局变量和static变量储存在data segment,本地变量运行时创建。BSS是Block Started by Symbol,不占据空间。

内存分布
最上方是stack,向下增长。之后是BSS段,然后是data segment段,之后是代码段。
stack segment同时维持了一个SP指针,用来访问堆栈中不在最上的数据。stack segment的用处:1、提供函数的本地变量 2、stack frame可以提供函数调用时的栈信息,call stack 3、临时变量的保存地方。

函数调用的细节:The Procedure Activation Record
一个典型的PAR:
Local Variables
Arguments
Static Link
ptr to previous frame
Return addresses
实际实现可能并不如此。在Unix中可以检查/usr/include/sys/frame.h来判断结果(附注:在我的Debian Lenny里面并没有这个头文件)。
函数返回的时候自动会清空栈,所以本地变量会被破坏,因此返回一个本地变量是没有意义的。
C中auto的意义(并不是SB谭浩强所说,由编译器决定存储位置)是“在堆栈中自动生成”。因此是一个完全没有必要的记号。(所以,在C++中用auto来表示“自动猜测返回值”是合情合理的)。
一个栈的帧可能并不在栈上,视情况而定。

控制线程
线程调用函数的时候,采用自己的栈帧。所以每个线程需要一个自己的堆栈。

setjmp和longjmp
setjmp(jmp_buf j)首先被调用,用变量j来标记当前位置。setjmp被设置的时候,返回0。
longjmp(jmp_buf j,int i)调用,用来跳回j标记的位置(setjmp命令所在位置),就像返回setjmp(j)一样。但是这时setjmp会返回i。
使用longjmp的时候j的值会被冲掉。

附注:POSIX man页面中值得提到的内容
longjmp中的变量如果是非volatile的,在setjmp和longjmp之间被修改的,是在同一函数内的,这三种情况下程序可能抽风。
longjmp中如果指定返回0,则函数返回1。
附注:另外实验了一下,似乎j的值不会被冲掉。不知道是不是因为书的版本太老。

UNIX中的栈
UNIX中的栈是自动增长的。在栈的顶端有一段“红灯区”^_^,一旦数据进入了这个区域则栈会自动膨胀。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值