摘要
static是C/C++中很常用的修饰符,用于控制变量或一个函数的存储方式和作用范围。
如何控制存储方式?
我们知道当创建变量或函数时,计算机会在栈区上开辟空间用于存储。我们看下面这张图:
如上是计算机内存的逻辑视图。
栈区用于存放局部变量和函数参数等临时变量,当用static修饰后就会将存储空间改为静态区。函数在执行时创建的变量会在栈区上分配空间,但是再函数执行完该空间会被销毁,如果不想让某些变量一并被销毁,即可用static修饰。
下面这张图可以直观地解释
这会有什么影响?
我们知道,普通局部变量的作用域是在该变量所在的函数内部或者复合语句的内部,且生命周期也是临时的,这表示在函数或者复合语句结束后该变量也会被销毁。
而当变量被static修饰后存在于静态区,变量的性质发生了改变。变量获得了类似于全局变量的生命周期,即直到程序结束该变量都不会被销毁,当下一次使用变量时,该变量的值是上一次运行后得到的结果。需要注意一点,static修饰后的变量如果没有初始化,系统会自动赋值为0,且只初始化一次。
变量的作用域不会改变,且仅能在本文件中使用,无法被extern关键字跨文件引用。为什么呢?这涉及到一个概念,链接属性。
链接属性?
用static修饰,本质上是将变量的外部链接属性变为内部链接属性。
外部链接:允许跨文件进行访问
内部链接:只允许在本文件中进行访问
常见外部链接:全局变量,自定义函数等。
常见内部链接:函数或复合语句内定义的变量或函数等。
囿于笔者才疏学浅,不能具体解释何为链接属性,烦请各位有疑惑的看官自行搜索、结合实际代码自行体会。
为什么static?
- 静态全局变量不能被其它文件引用,因此可以在其它文件中定义相同名称的变量和函数,不会引起冲突。
- 熟悉运用static是一个良好习惯:可节约内存空间,提高时间效率。
举例:当一个变量需要被多个对象同时使用时,该变量只在静态区存储一处,但是面对所有对象的值都是相同的,不必每次面对对象都创建一个变量,从而提高效率。