当函数被调用时发生了什么:过程活动记录
C运行时系统在它自己的地址空间内如何管理程序。
事实上,C语言的运行时函数非常少,但各个短小精悍。相反的例子是Ada或C++。
如果C程序需要一些服务(如动态内存分配),它通常必须进行显示请求。这使C成为一种非常高效的语言。但它也向程序员施加了一个额外的负担。
C语言自动提供的服务之一就是跟踪调用链---那些函数调用了那些函数,以及当一个return语句执行后,控制将返回何处等。解决这个问题的经典机制就是堆栈中的过程活动记录。当每个函数被调用时,都会产生一个过程活动记录(或类似的结构)。过程活动记录是一种数据结构,用于支持过程调用,并记录调用结束以后返回调用点所需要的全部信息。
局部变量(local variable)
参数(argument)
静态链接(static link)(用于上层引用,C语言不使用)
指向先前结构的指针
返回地址(return address)
图6-4 过程活动记录的规范描述
活动记录内容很具有说明性。结构的具体细节在不同的编译器中各有不同,这些字段的次序可能很不相同,而且可能存在一个在调用函数前保存寄存器值的区域。头文件/usr/include/sys/frame.h描述了过程活动记录就在UNIX系统中的样子。在SPARC计算机上,过程活动记录非常大(几十个字),因为它提供了保存寄存器窗口的空间。在x86架构中,过程活动记录多少要小一些。运行时