标识符的存储属性

存储变量值的内存类型。直接决定变量何时创建何时销毁以及生命周期。

存储变量的位置:

  • 普通内存
  • 运行时堆栈
  • 硬件寄存器

缺省存储类型取决于声明位置

  • 在任何代码块之外声明的变量总是存储于静态内存 -> 静态变量
    • 无法为其指定其他存储类型
    • 在程序运行之前创建,整个执行期间始终存在。
    • 始终保持原先的值,除非赋另一个值或程序结束
  • 在代码块内部声明的变量的缺省存储类型是自动的,存储于堆栈中 -> 自动变量
    • auto用于修饰该类型,因为代码块变量在缺省下就是自动变量
    • 程序执行到声明自动变量的代码块时创建,执行流离开后销毁
    • 代码块数次执行时每次都会重新创建

非缺省情况下

  • 在代码块内部声明变量,加上static后可转化为静态变量:

    • 在整个程序执行过程中一直存在,而非代码块开始时创建,执行后销毁
    • 修改存储类型并不修改变量作用域,仍然只能在代码块内部按名字访问
    • 函数形参不能声明为静态,因为实参总是在堆栈中传递给函数
  • 可以给自动变量声明增加register修饰,提示需要放在硬件寄存器中 -> 寄存器变量

    • 最终由寄存器决定哪些变量放在寄存器中
    • 使用频率高的变量声明为寄存器变量可提高程序效率,例如频繁访问的指针
    • 创建和销毁时间与自动变量相同,但使用寄存器变量的函数返回之前需要恢复调用前的寄存器值

初始化

静态变量

  • 程序需要初始化的静态变量值可以提前设置在未来使用的位置,在将可执行文件载入内存后,这个位置会赋值给对应变量。
  • 未显式指定下,初始值为0。
  • 仅在程序开始执行前初始化一次

自动变量:

  • 程序链接时无法判断存储位置,每次调用可能占据不同位置
  • 未显式初始化下,值为垃圾
  • 显式初始化则是在代码块的起始处插入隐式赋值语句,程序每次执行代码块时都会重新初始化。
  • 除声明为const变量外,声明变量同时进行初始化和 先声明后赋值不存在效率差距
  • 初始化在运行时执行,可用任何表达式作为初始化值
posted @ 2026-07-15 23:14  tanch25  阅读(6)  评论(0)    收藏  举报