变量存储方式

上传人:ji****72 文档编号:37622184 上传时间:2018-04-20 格式:DOC 页数:62 大小:225.50KB
返回 下载 相关 举报
变量存储方式_第1页
第1页 / 共62页
变量存储方式_第2页
第2页 / 共62页
变量存储方式_第3页
第3页 / 共62页
变量存储方式_第4页
第4页 / 共62页
变量存储方式_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《变量存储方式》由会员分享,可在线阅读,更多相关《变量存储方式(62页珍藏版)》请在金锄头文库上搜索。

1、C 语言的强大功能之一是可以灵活地定义数据的存储方式语言的强大功能之一是可以灵活地定义数据的存储方式.C 语言从语言从两个方面控制变量的性质两个方面控制变量的性质:作用域作用域(scope)和生存期和生存期(lifetime). 作用域作用域是指可以存取变量的代码范围是指可以存取变量的代码范围,生存期是指可以存取变量的时间范围生存期是指可以存取变量的时间范围. 作用域有三种作用域有三种: 1. extern(外部的外部的) 这是在函数外部定义的变量的缺省存储方式这是在函数外部定义的变量的缺省存储方式.extern 变量的作用域是整个程序变量的作用域是整个程序. 2.static(静态的静态的)

2、 在函数外部说明为在函数外部说明为 static 的变量的作用域为从定的变量的作用域为从定义点到该文件尾部义点到该文件尾部; 3.auto(自动的自动的) 这是在函数内部说明的变量的缺省存储方式这是在函数内部说明的变量的缺省存储方式.auto变量的作用域为变量的作用域为从定义点到该局部程序块尾部从定义点到该局部程序块尾部.变量的生存期也有三种变量的生存期也有三种,但它们不象作用域那样有预定义的关键但它们不象作用域那样有预定义的关键字名称字名称.第一种是第一种是 extern 和和 static 变量的生存期变量的生存期,它它从从main()函数被调函数被调用之前开始用之前开始,到程序退出时为止

3、到程序退出时为止.第二种是函数参数和第二种是函数参数和 auto 变量的生变量的生存期存期,它从它从函数调用时开始函数调用时开始,到函数返回时为止到函数返回时为止.第三种第三种 是动态分配的是动态分配的数据的生存期数据的生存期,它从程序调用它从程序调用 malloc()或或 calloc()为数据分配存储空间为数据分配存储空间时开始时开始,到程序调用到程序调用 free()或程序退出时为止或程序退出时为止. 2.1 变量存储在内存变量存储在内存(memory)中的什么地方中的什么地方? 变量可以存储在内存中的不同地方变量可以存储在内存中的不同地方,这依赖于它们的生存期这依赖于它们的生存期.在函

4、在函数外部定义的变量数外部定义的变量(全局变量或静态外部变量全局变量或静态外部变量)和在函数内部定义的和在函数内部定义的static 变量变量,其生存期就是其生存期就是程序运行的全过程程序运行的全过程,这些变量被存储在数据这些变量被存储在数据段段(datasegment)中中.数据段是在内存中为这些变量留出的一段大小固数据段是在内存中为这些变量留出的一段大小固定的空间定的空间,它分为两部分它分为两部分,一部分用来存放初始化变量一部分用来存放初始化变量,另一部分用来另一部分用来存放未初始化变量存放未初始化变量.在函数内部定义的在函数内部定义的 auto 变量变量(没有用关键字没有用关键字 sta

5、tic定义的变量定义的变量)的生存期从程序开始执行其所在的程序块代码时开始的生存期从程序开始执行其所在的程序块代码时开始,到到程序离开该程序块时为止程序离开该程序块时为止.作为函数参数的变量只在调用该函数期间作为函数参数的变量只在调用该函数期间存在存在. 这些变量被存储在栈这些变量被存储在栈(stack)中中.栈是内存中的一段空间栈是内存中的一段空间,开始很开始很小小,以后逐渐自动增大以后逐渐自动增大,直到达到某个预定义的界限直到达到某个预定义的界限.在象在象 DOS 这样的这样的没有虚拟内存没有虚拟内存(virtual memory)的系统中的系统中,这个界限由系统决定这个界限由系统决定,并

6、且并且通常非常大通常非常大,因此程序员不必担心用尽栈空间因此程序员不必担心用尽栈空间.关于虚拟内存的讨论关于虚拟内存的讨论,请参见请参见 2.3. 第三种第三种(也是最后一种也是最后一种)内存空间实际上并不存储变量内存空间实际上并不存储变量,但是可以但是可以用来存储用来存储变量所指向的数据变量所指向的数据.如果把调用如果把调用 malloc()函数的结果赋给一函数的结果赋给一个指针变量个指针变量,那么这个指针变量将包含一块动态分配的内存的地址那么这个指针变量将包含一块动态分配的内存的地址,这这块内存位于一段名为块内存位于一段名为“堆堆(heap)“的内存空间中的内存空间中.堆开始时也很小堆开始

7、时也很小,但当但当程序员调用程序员调用 malloc()或或 calloc()等内存分配函数时,它就会增大等内存分配函数时,它就会增大.堆可堆可以和数据段或栈共用一个内存段以和数据段或栈共用一个内存段(memorysegment ),也可以有它自己也可以有它自己的内存段的内存段,这完全取决于编译选项和操作系统这完全取决于编译选项和操作系统.与栈相似与栈相似,堆也有一个堆也有一个增长界限增长界限,并且决定这个界限的规则与栈相同并且决定这个界限的规则与栈相同. 请参见请参见: 1.1 什么是局部程序块什么是局部程序块(10calblock)? 2.2 变量必须初始化吗变量必须初始化吗? 2.3 什

8、么是页抖动什么是页抖动(pagethrashing)? 7.20 什么是栈什么是栈(stack)? 7.21 什么是堆什么是堆(heap)7 . 2.2 变量必须初始化吗变量必须初始化吗? 不不.使用变量之前应该给变量一个值使用变量之前应该给变量一个值,一个好的编译程序将帮助你一个好的编译程序将帮助你发现那些还没有被给定一个值就被使用的变量发现那些还没有被给定一个值就被使用的变量.不过不过,变量不一定需要变量不一定需要初始化初始化.在函数外部定义的变量或者在函数内部用在函数外部定义的变量或者在函数内部用 static 关键字定义关键字定义的变量的变量(被定义在数据段中的那些变量被定义在数据段中

9、的那些变量,见见 2.1)在没有明确地被程序初在没有明确地被程序初始化之前都已被系统初始化为始化之前都已被系统初始化为 0 了了.在函数内部或程序块内部定义的在函数内部或程序块内部定义的不带不带 static 关键字的变量都是自动变量关键字的变量都是自动变量,如果你没有明确地初始化这如果你没有明确地初始化这些变量些变量,它们就会具有未定义值它们就会具有未定义值.如果你没有初始化一个自动变量如果你没有初始化一个自动变量,在在使用它之前你就必须保证先给它赋值使用它之前你就必须保证先给它赋值. 调用调用 malloc()函数从堆中分配函数从堆中分配到的空间也包含未定义的数据到的空间也包含未定义的数据

10、, 因此在使用它之前必须先进行初始因此在使用它之前必须先进行初始化化,但调用但调用 calloc()函数分配到的空间在分配时就已经被初始化为函数分配到的空间在分配时就已经被初始化为 0 了了.请参见请参见: 1.1 什么是局部程序块什么是局部程序块(10calblock)? 7.20 什么是栈什么是栈(stack)? 7.21 什么是堆什么是堆(heap)? 2.3 什么是页抖动什么是页抖动(pagethrashing)? 有些操作系统有些操作系统(如如 UNIX 和增强模式下的和增强模式下的 Windows)使用虚拟内存使用虚拟内存 ,这这是一种使机器的作业地址空间大于实际内存的技术是一种使

11、机器的作业地址空间大于实际内存的技术,它是通过用磁盘它是通过用磁盘空间模拟空间模拟 RAM(randomaccess memory)来实现的来实现的. 在在 80386 和更和更高级的高级的 Intel CPU 芯片中芯片中,在现有的大多数其它微处理器在现有的大多数其它微处理器(如如Motorola 68030,sparc 和和 Power PC)中中,都有一个被称为内存管理单都有一个被称为内存管理单元元(Memory Management Unit,缩写为缩写为 MMU)的器件的器件.MMU 把内存看把内存看作是由一系列作是由一系列“页页(page)“组成的来处理组成的来处理.一页内存是指一

12、个具有一定一页内存是指一个具有一定大小的连续的内存块大小的连续的内存块,通常为通常为 4096 或或 8192 字节字节.操作系统为每个正在操作系统为每个正在运行的程序建立并维护一张被称为进程内存映射运行的程序建立并维护一张被称为进程内存映射(Process Memory Map,缩与为缩与为 PMM)的表的表,表中记录了程序可以存取表中记录了程序可以存取的所有内存页以及它们的实际位置的所有内存页以及它们的实际位置. 每当程序存取一块内存时每当程序存取一块内存时,它会它会把相应的地址把相应的地址(虚拟地址虚拟地址,virtual address)传送给传送给 MMU,MMU 会在会在PMM 中

13、查找这块内存的实际位置中查找这块内存的实际位置(物理地址物理地址,physical address),物理物理地址可以是由操作系统指定的在内存中或磁盘上的任何位置地址可以是由操作系统指定的在内存中或磁盘上的任何位置.如果程如果程序要存取的位置在磁盘上序要存取的位置在磁盘上,就必须把包含该地址的页从磁盘上读到内就必须把包含该地址的页从磁盘上读到内存中存中,并且必须更新并且必须更新 PMM 以反映这个变化以反映这个变化(这被称为这被称为 pagefault,即页即页错错). 希望你继续读下去希望你继续读下去,因为下面就要介绍其中的难点了因为下面就要介绍其中的难点了.存取磁盘比存取存取磁盘比存取RA

14、M 要慢得多要慢得多,所以操作系统会试图在所以操作系统会试图在 RAM 中保持尽量多的虚拟中保持尽量多的虚拟内存内存.如果你在运行一个非常大的程序如果你在运行一个非常大的程序(或者同时运行几个小程序或者同时运行几个小程序),那那么可能没有足够的么可能没有足够的 RAM 来承担程序要使用的全部内存来承担程序要使用的全部内存,因此必须把因此必须把一些页从一些页从 RAM 中移到磁盘上中移到磁盘上(这被为这被为 pagingout,即页出即页出). 操作系统会试图去判断哪些页可能暂时不会被使用操作系统会试图去判断哪些页可能暂时不会被使用(通常基于过去使通常基于过去使用内存的情况用内存的情况),如果它

15、判断错了如果它判断错了,或者程序正在很多地方存取很多内或者程序正在很多地方存取很多内存存,那么为了读入已调出的页那么为了读入已调出的页,就会产生大量页错动作就会产生大量页错动作.因为因为 RAM 已被已被全部使用全部使用,所以为了调入要存取的一页所以为了调入要存取的一页,必须调出另一页必须调出另一页,而这将导致而这将导致更多的页错动作更多的页错动作,因为此时不同的一页已被移到磁盘上因为此时不同的一页已被移到磁盘上.在短时间内出在短时间内出现大量页错动作的情形被称为页抖动现大量页错动作的情形被称为页抖动,它将大大降低系统的执行效率它将大大降低系统的执行效率.频繁存取内存中大量散布的位置的程序更容

16、易在系统中造成页频繁存取内存中大量散布的位置的程序更容易在系统中造成页 抖动抖动.如如果同时运行许多小程序果同时运行许多小程序,而实际上已经不再使用这些程序而实际上已经不再使用这些程序 ,也很容易也很容易造成页抖动造成页抖动.为了减少页抖动为了减少页抖动,你应该减少同时运行的程序的数目你应该减少同时运行的程序的数目.对对于大的程序于大的程序,你应该改变它的工作方式你应该改变它的工作方式,以尽量使操作系统能准确地判以尽量使操作系统能准确地判断出哪些页不再需要断出哪些页不再需要.为此为此,你可以使用高速缓冲存储技术你可以使用高速缓冲存储技术,或者改变或者改变用于大型数据结构的查找算法用于大型数据结构的查找算法,或者使用效率更高的或者使用效率更高的 malloc()函数函数.当当然然,你也可以考虑增加系统的你也可以考虑增加系统的 RAM, 以减少页出动作以减少页出动作. 请参见请参见: 7.17 怎样说明一个大于怎样说明一个大于 640KB 的数组的数组? 7.21 什么是堆什么是堆(heap)? 18.14 怎样才能使怎样才能使 DOS 程序获得

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号