一、代码与数据
1、编程语言理论的经典对立之一就是代码和数据的区别。
2、代码和数据的区别也可以认为是编译时和运行时的分界线。编译器的绝大部分工作都跟编译代码有关,必要的数据存储管理的绝大部分都在运行时进行。
3、学习运行时系统的有点
1)、有助于优化代码,获得最佳的效率。
2)、有助于理解更高级的材料。
3)、使分析问题更加容易。
二、a.out及其相关
1、a.out是汇编程序输出,而是连接器输出。
2、为重要的的数据定义标签,用独特的数据惟一地标识该数据是一种普遍采用的编程技巧。
3、操作系统在a.out中做了什么
本质上说,段在正在执行的程序中是一块内存的区域,每个区域都有特定的目的。
1)、文本段包含程序的指令。连接器把指令直接从文件拷贝到内存中,因程序的文本不变,之后不再管理。有些操作系统甚至可以向段中不同的section赋予不同的属性。
2)、数据段包含经过初始化的全局和静态变量以及它们的值。包括数据段和BSS段的整个段统称数据区。
3)、堆栈段用于保存局部变量,临时数据,传递到函数中的参数等。
4)、虚拟地址空间的最低部分未被映射。它用于捕捉使用指针和小型整值得指针引用内存的情况。
4、C语言运行时系统在a.out里干了什么
运行时的数据分好几种:堆栈,活动记录,数据,堆。
1)、堆栈段包含了一种单一的数据结构——堆栈。
2)、堆栈为函数内部声明的局部变量提供存储空间。按C术语,这些变量称为“自动变量”。
3)、进行函数调用时,堆栈存储与此有关的一些维护性信息,这些信息称为堆栈结构或活动记录。它包括函数调用地址、任何不适合装入寄存器的参数以及一些寄存器值得保存。
4)、堆栈也可以做暂时存储区。
注意:除了递归调用之外,堆栈并非必须。
5、当函数被调用时发生了什么:过程活动记录
1)、过程活动记录是一种数据结构,用于支持活动调用,用于支持过程调用,并记录调用结束后返回调用点所需要的全部信息。(P123 图6-4)
2)、C语言中不允许函数和数据在函数内部定义且不允许用这种方式进行函数嵌套。
注意:过程活动记录可能并不存在堆栈中。
三、段
1、目标文件和可执行文件可以有几种不同的格式。(例:ELF、COFF、a.out)所有这些不同的格式都有一个“段”的概念。对目标文件而言,段是二进制文件中简单的区域,里面保存了某种特定类型相关的信息。
2、UNIX与Intel x86中段概念的不同
1)、在UNIX中,段表示一个二进制文件相关的内容。
2)、在Lntel x86内存中,段表示一种设计的结果。
3、C语言各个部分会出现在那个段中。(P118 图6.1)
注意:1)、运行时所需要的BSS段的大小记录在目标文件中,但BSS段并不占据目标文件的任何空间。
2)、 数据段保存在目标文件中。
3)、BSS段不保存在目标文件中(除了记录BSS段在运行时所需的大小)。
4)、文本段最容易受优化措施影响的段。
5)、a.out1文件的大小受调试状态下编译的影响,但段不收影响。
四、控制线程
线程是一种非常强大的编程模式,即使在单个处理器上也可以提高性能。
五、setjmp和longjmp
1、setjmp(jmp_buf j)必须首先被调用,他表示“使用j记录现在的位置,函数返回零。”
2、longjmp(jmp_buf j,int i)可以接着被调用,他表示“回到j所记录的位置,让它看上去像是原先的setjmp()返回函数一样。但是函数返回 i,使代码能够知道他是实际上是通过longjmp()返回的。”
六、UNIX和MS-DOS中的堆栈段
1、在UNIX中但需要更多的空间时,堆栈会使用某种形式的虚拟内存自动增长。
2、在DOS中,在建立可执行文件时,堆栈的大小必须同时确定,而且它不能再运行时增长。
七、有用的C语言工具