首页 > 代码库 > 1005------C语言-----------C语言变量的存储方式解析
1005------C语言-----------C语言变量的存储方式解析
0.背景
在看APUE第七章的时候,作者分析了setjmp和longjmp这种函数间跳转机制对不同存储类型变量的影响,看到register,auto,volatile,static等等这些关键字很模糊,也可能太少用了,但是自认为C语言基础不错的我还是不能接受任何不懂的知识点,于是就捋了捋思路。
1.C语言变量的基本属性
在C语言中,每一个变量都有3个属性:
(1)类型,就是常用的int、char等,它确定了变量存储长度和运算方式;
(2)作用域,根据变量所处的位置分为全局变量和局部变量;
(3)存储方式,即变量的生存期,分为静态存储方式和动态存储方式。
2.静态存储方式和动态存储方式
(1)静态存储方式是指变量在程序执行的全过程中始终占据着大小固定的存储单元,直到程序运行结束才予以释放。
(2)动态存储的变量是指变量的存储单元在程序运行过程中由系统动态地分配和回收,当定义它们的函数被调用时分配内存,当定义它们的函数返回时系统收回变量所占内存。
3.和存储方式有关的关键字
(1)auto:自动变量,缺省情况下,所有变量都是auto的,这是C语言中使用最广泛的一种。自动变量为局部变量,存储方式属于动态存储,系统不为其进行默认初始化,未初始化的静态变量指向一个不可预期的、无意义的值。只有在使用它,即定义该变量的函数被调用时才给它分配存储单元,开始它的生存期。函数调用结束,释放存储单元,结束生存期。
(2)register:寄存器变量,与auto一样,属局部变量,动态存储方式。寄存器变量请求编译器尽可能将变量存储在CPU内部寄存器中而不是通过内存访问以提高效率。注意,对于寄存器变量,很多C编译器并没有真正将寄存器变量放到CPU内部,而是作为自动变量处理。使用register只是提示编译器将变量定义为寄存器变量,期望编译器将其作为寄存器变量,但不一定能达到期望。因为要看编译器是否支持了,其次看看CPU内部是否有可用寄存器空间。
(3)static:静态变量,分为静态全局变量和静态局部变量。我们都知道局部变量是动态存储的,用static修饰局部变量就称作静态局部变量,它使得该局部变量拥有静态存储的生存期,即从分配内存单元起一直到程序运行结束。静态全局变量使得该全局变量只能在定义它的文件中使用,对于一般的全局变量要想在别的文件中访问只需要一个外部引用声明即可(extern)。此外,基本类型的静态变量系统会自动为其赋初值,静态存储方式不等于静态变量。
(4)extern:外部变量,修饰变量或函数,表示这个变量或者函数是外来的,即定义在别的文件中,这个比较常见。
(5)volatile:易失变量,这个很少用见到,易失变量用来防止编译器优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存,这里要知道编译器优化手段之一就是把内存变量保存到寄存器中以提高效率,变量前面加volatile就是禁止这个操作。
4.参考资料
(1)http://lavasoft.blog.51cto.com/62575/186951/
(2)http://blog.csdn.net/ouyangzhengxuan/article/details/7325505
(3)http://www.worlduc.com/blog2012.aspx?bid=3243095
(4)《C语言深度剖析》
1005------C语言-----------C语言变量的存储方式解析