静态变量

✍ dations ◷ 2024-09-20 13:45:26 #计算机编程,计算机科学,程序架构

静态变量(英语:Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(英语:Static memory allocation)(也即在运行时中不再改变分配情况)存储空间的一类变量。与之相对应的是在运行时只暂时存在的自动变量(即局部变量)与以动态分配方式获取存储空间的一些对象,其中自动变量的存储空间在调用栈上分配与释放。

“静态变量”这一术语有两个容易混淆的定义:

而在以Pascal为代表的许多程序语言中,所有局部变量都由系统自动分配存储空间,而所有全局变量的存储空间则以静态分配的方式获取(对应“静态变量”),因此由于实际上“局部变量”和“全局变量”这两个术语已足以涵盖所有的情况,在这些程序语言中通常不使用“静态变量”这一术语,而直接以“全局变量”代之。一般来说,在这些程序语言中,静态变量就是全局变量,而即使在有明确区分全局和静态变量的程序语言中,在编译后的代码里二者也以相同的方式获取存储空间。而今术语“静态变量”的概念则主要基于C族语言的“static”的定义(即定义2)。

静态变量也可以用于存储常数。具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时设定,并且无法在运行时改变。编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。

在C语言及由其派生出的C++与Objective-C等程序语言中,“static”是用于控制变量的生命周期和连接方式(即其作用域,亦即可见性)的保留字。确切来说,正如C族语言中的extern,auto与register这些保留字一样,static也是一种存储类(此处的“类”与面向对象语言的“类”的定义不同)标识。每个变量与函数都有以上的一种存储类标识,如果在声明(英语:Declaration (computer programming))中没有明确标识其存储类,编译时就会根据上下文来选择其默认存储类,如在源文件里的所有文件级变量对应的默认存储类是extern,而在函数体内的变量对应的则是auto,各存储类的属性如下表所列。

易见存储类为extern的变量(包括上面提到的未明确声明存储类的文件级变量)符合前段所述静态变量的定义1,但不符合定义2。

除明确标识出变量的生命周期(英语:Object lifetime)外,将变量声明为static存储类还会根据变量属性不同而有一些特殊的作用:

在C语言中,带有静态变量的程序如下所示:

#include <stdio.h>void func() {	static int x = 0; // 在对func的三次调用中,x只进行一次初始化	printf("%d\n", x); // 输出x的值	x = x + 1;}int main(int argc, char * const argv) {	func(); // 输出0	func(); // 输出1	func(); // 输出2	return 0;}

C++示例

在C++中,带有含私有静态内部变量的类的程序如下所示:

相关

  • 社会生活生活是人类活着的期间所做的一切行为的总称。社会生活是日常生活、都市生活、政治生活、文化生活、艺术生活、宗教生活的总称。社会生活是一个整体,各行各业的工作,对社会来说
  • 凝固凝固是指在温度降低时,物质由液态变为固态的过程,物质凝固时的温度称为凝固点。目前已知的液体几乎都可以在低温时凝固成为固体,氦是唯一的例外,常压下在绝对零度时仍为液体(液态
  • 胡安·伊格纳西奥·西拉克·萨斯图赖因胡安·伊格纳西奥·西拉克·萨斯图赖因(西班牙语:Juan Ignacio Cirac Sasturain,1965年10月11日-),生于西班牙加泰罗尼亚曼雷萨,西班牙物理学家。他是量子计算机及量子信息论领域的
  • 瑟莫赫特瑟莫赫特(Semerkhet)是古埃及第一王朝的第六位法老,其统治在公元前2950年前后。瑟莫赫特统治期间记载甚少,但是据曼涅托的记载,他的统治似乎经历了一段困难时期——其间发生了数
  • span class=nowrapDy(NOsub3/sub)sub3/sub/span硝酸镝是一种无机化合物,化学式为Dy(NO3)3。硝酸镝可以将氧化镝、氢氧化镝或碳酸镝溶于硝酸得到:所得溶液经过小心蒸发可以得到水合硝酸镝,其中六水合物最常见。水合硝酸镝受热
  • 蛮蚁亚科蛮蚁亚科(Agroecomyrmecinae)隶属蚁科,下辖2个现生的属及2个已灭绝的属。该亚科起初是由 Carpenter 在1930年以家蚁亚科蛮蚁族发表。Barry Bolton 于2003年将其提升至亚科,并提
  • 福尔摩沙十一郡省福尔摩沙十一郡省是1640年代荷兰东印度公司苏格兰籍员工大卫·莱特(David Wright)提出用以划分荷兰在台接触到的11个“郡省”地理区域。关于这11个郡省,在传教士甘为霖的著作《
  • 李英国李英国(朝鲜语:이영국/李英國,1962年-),脱北者,朝鲜民主主义人民共和国前任领导人金正日的保镖。有感于北朝鲜社会特别是领导人身边严苛而充满恐惧的生活,曾试图逃离北朝鲜,于1994年被
  • 阿拉伯基督徒阿拉伯基督徒在广义上指生活在阿拉伯世界信仰基督教的群体。狭义上指近东地区的巴勒斯坦基督徒。各类数据统计在500万至2000万人之间,一般认为在600万至800万人间。主要分布
  • 心脸皮肤综合征CFC症候群(英文简称CFC)是一种遗传病,其会导致心脏及皮肤出现问题,如肺动脉狭窄、瓣膜发育不良、心室中膈缺损、心肌肥厚症、心律不整以及皮肤过度角质化、鱼鳞病、毛孔角化症、