第6章 运动的诗章:运行时数据结构
代码和数据的区别也可以认为是编译时和运行时的分界线。编译器的绝大部分工作都跟翻译代码有关;必要的数据存储管理的绝大部分都在运行时进行。
目标文件和可执行文件可以有几种不同的格式。所有这些不同的格式具有一个共同的概念,那就是段(与Intel x86内存模型的段不同)。就目标文件而言,它是二进制文件中简单的区域,里面保存了和某种特定类型相关的所有信息。
段可以方便地映射到链接器,在运行时可以直接载入的对象中。载入器只是取文件中每个段的映像,并直接将它们放入到内存中。从本质上说,段在正在执行的程序中是一块内存区域,每个区域都有特定的目的。文本段包含程序的指令。数据段包含经过初始化的全局和静态变量。BSS段包含未初始化的数据。堆栈段用于保存局部变量、临时数据、传递到函数中的参数等。
运行是数据结构有好几种:堆栈、活动记录、数据、堆等。
堆栈是一个经典的计算机科学对象,它是一块动态内存区域,实现了一种“后进先出”的结构。
堆栈有三个用途:1、堆栈为函数内部声明的局部变量提供存储空间;2、进行函数调用时,堆栈存储与此有关的一些维护信息(过程活动记录);3、堆栈也可以被用作暂时存储区。
当每个函数被调用时,都会产生一个过程活动记录(或者类似的结构)。这种数据结构用于支持过程调用,并记录调用结束以后返回调用点所需要的全部信息。
当进入函数时,自动变量在堆栈中分配。当函数结束后,变量不复存在,它所占用的堆栈空间被回收,可能在任何时候被覆盖。如果把一个变量声明为static,就能保证该变量被保存在数据段中而不是堆栈段中。该变量的生命期就和程序一样长,当定义该变量的函数退出时,该变量的值依然能保持。
存储类型说明符auto关键字在实际中从来用不着。它表示“在进入该块后,自动分配存储”,但是在函数内部声明的数据缺省就是这种分配。
过程活动记录并不一定要存储在堆栈中。事实上,尽可能地把过程活动记录的内容放到寄存器中会使函数调用的速度更快,效果更好。不过,这取决于硬件的结构。
文章评论(0条评论)
登录后参与讨论