标识符的存储属性
存储变量值的内存类型。直接决定变量何时创建何时销毁以及生命周期。
存储变量的位置:
- 普通内存
- 运行时堆栈
- 硬件寄存器
缺省存储类型取决于声明位置
- 在任何代码块之外声明的变量总是存储于静态内存 -> 静态变量
- 无法为其指定其他存储类型
- 在程序运行之前创建,整个执行期间始终存在。
- 始终保持原先的值,除非赋另一个值或程序结束
- 在代码块内部声明的变量的缺省存储类型是自动的,存储于堆栈中 -> 自动变量
- auto用于修饰该类型,因为代码块变量在缺省下就是自动变量
- 程序执行到声明自动变量的代码块时创建,执行流离开后销毁
- 代码块数次执行时每次都会重新创建
非缺省情况下
-
在代码块内部声明变量,加上static后可转化为静态变量:
- 在整个程序执行过程中一直存在,而非代码块开始时创建,执行后销毁
- 修改存储类型并不修改变量作用域,仍然只能在代码块内部按名字访问
- 函数形参不能声明为静态,因为实参总是在堆栈中传递给函数
-
可以给自动变量声明增加register修饰,提示需要放在硬件寄存器中 -> 寄存器变量
- 最终由寄存器决定哪些变量放在寄存器中
- 使用频率高的变量声明为寄存器变量可提高程序效率,例如频繁访问的指针
- 创建和销毁时间与自动变量相同,但使用寄存器变量的函数返回之前需要恢复调用前的寄存器值
初始化
静态变量
- 程序需要初始化的静态变量值可以提前设置在未来使用的位置,在将可执行文件载入内存后,这个位置会赋值给对应变量。
- 未显式指定下,初始值为0。
- 仅在程序开始执行前初始化一次
自动变量:
- 程序链接时无法判断存储位置,每次调用可能占据不同位置
- 未显式初始化下,值为垃圾
- 显式初始化则是在代码块的起始处插入隐式赋值语句,程序每次执行代码块时都会重新初始化。
- 除声明为const变量外,声明变量同时进行初始化和 先声明后赋值不存在效率差距
- 初始化在运行时执行,可用任何表达式作为初始化值
浙公网安备 33010602011771号