以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  4种基本的存储类型[转帖]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=125393)


--  作者:happem
--  发布时间:8/22/2012 3:02:00 PM

--  4种基本的存储类型[转帖]

我们知道,任何可执行程序最终都会变成一系列的机器指令和数据,在把一个程序的源代码转变为机器指令序列的过程中,一些程序元素被剔除了。另一些程序元素则保留在可执行代码中。

标准C语言为变量、常量和函数等定义了4种存储类型,即:extern、auto、static、register,它们分别用一个关键词来说明,一个程序元素的存储器类型与它的作用域、生存期限及连接类型具有某种微妙的关系,但是一个具有作用域和连接类型的标识符不一定就具有存储类型。

这4种存储类型可分为两种生存期限,永久的。

Extern和static用来标识永久生存期限的变量和函数,而auto和register则用来标识临时生存期限的变量,一个变量或函数只能具有一种存储类型,当然也只能有一种生存期限。默认情况下,全局变量和全局函数的存储类型是extern的,能够被定义在它们之后的同一个编译单元内的函数调用。如果变量和函数被显式地加上extern声明,那么其他编译单元中的函数也能调用它们。显式地声明为static的全局变量和全局函数具有static存储类型,只能被同一个编译单元内的函数调用。

局部变量默认具有auto存储类型,除非用static或register来定义。但不管如何,它们的作用域都是程序块作用域,链接类型都是内连接,在进入函数的时候创建,在函数退出的时候销毁,register和auto只能声明局部变量和局部常量。

全局常量的默认存储类型为static的,除非在定义了它的编译单元之外的其他编译单元显式地用extern声明。否则不能被访问。

局部符号常量的默认存储类型为auto,除非显式地定义为static或register。

函数的形参是局部变量,因此与一般局部变量的存储类型相同,但是最好不要声明为static的。用register修饰的变量会被直接加载到CPU寄存器中,如果寄存器足以容纳得下它的话,把那些经常使用的变量例如循环计数器等直接放到CPU寄存器中,可以避免在寄存器和内存之间频繁地交换数据,因此能够提高城乡的运作效率,现在有一些聪明的编译器,它们会对程序中出现的变量进行使用频率的评估。把使用频率较高、体积较小的变量直接放入CPU寄存器中,因此一般情况下不需要程序员显式地使用register说明符。

实际上还有一种存储类型,但它不是变量或函数的属性,而是存储空间的属性,那就是自由存储,不过,这种存储类型与我们这讨论的存储类型已经是完全不同的概念了,它的生存期限不属于上述任何一种,是自由的,即用户根据需要显式地分配和释放,它的生存期限就是分配和释放之间这一段时间。
资源来自:http://www.lirenedu.org/index.php?ack=xinwen&id=1171


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms