计算机程序在运行时,操作系统首先要将存放在外存储器(硬盘)上的可执行文件代码装载到计算机的内存中,然后运行内存中的程序代码。所以要聊程序的运行情况,只要看内存中的程序代码是怎么运行的就可以了。
程序代码装载到内存中后,占据了内存的一块区域,操作系统控制执行该区域中的代码。该区域的代码全部执行完后,程序就运行完毕。此时,操作系统会将该区域重新作为内存的空闲空间。
装载到内存中的程序代码区域称为程序的内存映像,其按存放的内容可以分为3个区。
(1)程序区:存放程序指令的区域。
(2)静态存储区:存放永久数据区域。
(3)动态存储区:存放临时数据的区域。
这里说的永久数据,是指从程序开始运行一直到程序运行结束始终存在的数据,临时数据是指程序运行的某个阶段存在和使用的数据,过了这个阶段,该数据就被删除了。
这里说的数据,其实是占据了内存空间的变量或数组。数据删除就是该变量或数组撤销,所占据的内存空间作为空闲空闲。
在程序运行结束时,除了使用内存映像中的指令和数据外,还涉及CPU的使用。所以我们在分析程序运行时,还考虑CPU。
程序的内存映像如图所示:
到目前为止,我们学过的变量和数组有的属于永久数据,如全局变量和全局数据,有的属于临时数据,如局部变量,局部数组及动态变量和动态数组;
全局变量一定是永久数据,它一定伴随程序的始终。动态变量一定是临时数据,他在运行时才由语句产生,并且由语句,局部变量可以是永久数据也可以是临时数据,之而取决于局部变量的前缀。若前缀为static表明是永久数据,称为静态数据;若前缀为auto表明是临时数据,称为自动数据;若没有折现前缀,则默认为是auto,即自动数据。函数的形参是自动数据。
全局变量也可以有前缀static,仍然是永久数据。
静态存储区还可以分为常量区和静态变量区,动态存储区还可以分为栈区和堆区, 常量都放在常量区,全局变量和静态变量存放在静态变量区。自动变量(包括函数形参)存放在栈区,动态变量存放在堆区。栈区的大小有限,但是堆区的空间非常大,适合开辟大容量的数组。
在多任务的操作系统下,程序区,静态存储区和动态存储区可以不再连续的空间,但是为了方便起见,我们将它看成连续空间中的3个空间。
二、register类型
CPU中的寄存器主要用于各种操作,包括这些寄存器是一先具有运算功能的存储单元。因为寄存器在CPU中又具有运算功能,并且其硬件的存储速度也比内存中的存储的单元的存储速度快的,所以当数据用寄存器保存时,显然效率更高。但是CPU中的寄存器数量少,而且都有相应的操作用途,所以一般不作为存储数据的单元来使用。但是有时候计算机操作所使用的的存储器不多,寄存器有多余,此时如能充分利用这些多余的寄存器存储数据以提高运行效率,也是一件好事。
为了在坑的情况下使用多余的寄存器存储数据,我们可以用前缀register将频繁使用的变量定义成寄存器变量。这样在程序运行时,若有多余的寄存器,将会作为该变量的存储单元使用,若无多余寄存器,则依然使用内存中存储单元。