静态变量

✍ dations ◷ 2024-12-22 23:01:08 #计算机编程,计算机科学,程序架构

静态变量(英语: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++中,带有含私有静态内部变量的类的程序如下所示:

相关

  • 显微镜下多血管炎显微镜下多血管炎(Microscopic polyangiitis、也称为"微观多动脉炎"(Microscopic polyarteritis),"微观多动脉炎结节(Microscopic polyarteritis nodosa),MPA)是一个不明确的
  • 斯洛伐克面积以下资讯是以2015年估计国家领袖国内生产总值(购买力平价) 以下资讯是以2016年估计国内生产总值(国际汇率) 以下资讯是以2016年估计人类发展指数 以下资讯是以2018年估计斯
  • 加洛林帝国加洛林帝国 (800–888) 是中世纪早期欧洲西部和中部的帝国。加洛林帝国被加洛林王朝统治,加洛林家族从751年开始成为法兰克国王,774年开始成为意大利伦巴底国王。800年,法兰克
  • 斯科舍板块斯科舍板块是一个大洋板块,北与南美洲板块相接,东与南桑威奇微板块相接,南和西则与南极洲板块接壤。斯科舍板块的北部和南部边界是转换边界,其东界与南桑威奇板块之间是离散边界
  • Eocene始新世(英语:Eocene)是地质时代中古近纪(Paleogene)的第二个主要分期,大约开始于5600万年前-终于3400万年前,介于古新世(Paleocene)与渐新世(Oligocene)之间。始新世(Eocene)之名,字源来自
  • 苏联内务部队内务部内卫部队(俄语:Внутренние войска Министерства внутренних дел,缩写为ВВ)是俄罗斯联邦负责保卫国内主要目标、维护国内公共
  • 宇宙暗流宇宙暗流(英语:Dark Flow),天体物理学用语,2008年最新发表的研究表明多数星系团以本动速度共通的大规模的速度场(纯粹的偏置值)天文现象而给予的学术名称。这是一种科学假说。本动
  • 周文雍烈士祖屋周文雍烈士祖屋,即周文雍故居,位于中国广东省江门市开平市百合镇茅冈村凤凰里。1983年3月,,列入开平县文物保护单位。该地是周文雍幼年生活过的地方,该故居内展有周文雍生前用过
  • 陆晋德陆晋德(1942年-),生于重庆,台湾企业家,陆正案受害家属,后创办财团法人陆正纪念基金会。祖籍江苏无锡,1948年随父母迁往台湾竹东镇。国立台湾大学农业经济学系毕业,1973年起任联工化学
  • 手动枪机手动供弹步枪(manual loading rifle),简称手动步枪(manual rifle),是指需要射击者完全用手施力操作完成将子弹送入膛室(上膛)并在射击后将用完的弹壳退出膛室(退膛)过程的步枪。由于每