参考:https://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html
- static的作用
-
隐藏
定义成“静态”,就表示对外部是不可见的。
比如静态局部 他的可见域就是在本函数内。对外部其他函数不可见。
比如静态全局 他的可见域就是在本.C文件内且是从他定义的位置开始往下。对外部其他文件不可见。 -
保值
“保值”意思就是一旦加了static关键字,那么变量在程序刚开始时就会完成初始化,他们是存放在“静态存储区”,全局变量也是存在这的。存放在静态存储区的兄弟是不会随着函数的结束而结束,他们会一直待在里面,直到整个程序结束。所以定义静态局部变量,在程序结束后,变量的值依然存在。int fun(void) { static int a = 100; xxx; }
fun
结束后,a
的值依然存在静态存储区中。这里引申一个知识点:
可编程内存 通常有5个区域用来存放变量:静态存储区、堆区、栈区、代码区、文字常量区。
静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。
代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。
文字常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等) 。函数指针指向Code区,是程序运行的指令代码,数据指针指向Data,Heap,Stack区,是程序依赖以运行的各种数据
-
节约程序员初始化成本
这是由于静态存储区的特性决定的。静态存储区的内容在一开始初始化时会默认把里面所有字节全部初始化成0x0。所以在定义一些static or 全局的数组 or 繁琐结构时,可以不需要对变量进行初始化。