C--存储类型和特征修饰

发布时间 2023-08-02 21:00:48作者: 智子lock

C语言中的存储类型和特征修饰

C语言中的变量定义

C语言变量定义的格式为:

存储类型 特征修饰 数据类型 变量名

存储类型:决定变量的存储位置
特征修饰:决定变量的特征属性
数据类型:决定变量的存储空间和数据范围
变量名:决定变量的引用标识

一般定义变量时,前两者都是省略的,比如

char a = 'a';

存储类型

当省略存储类型时,存储类型默认为autoauto只能修饰局部变量,其存储在栈区,并且生命周期为其所属的函数从开始到结束。存储类型决定了变量在内存中存储的位置与链接性,与此同时也决定了变量的生命周期。下面详细说明四个存储类型关键字。

关键字 存储位置 链接性 生命周期 所修饰变量 补充说明
auto 栈区 本地 所属函数开始到结束 局部变量 定义变量时如果没有显示指定存储类型,那么编译器将默认视之为auto存储类型。
extern DATA段(初始化数据段) 外部 所属程序从开始运行到结束 全局 extern关键字告诉编译器其修饰的变量是引用自外部文件,不需要为其分配内存空间;extern变量不能和static变量同时使用
static 静态区(初始化数据段) 本地 所属程序从开始运行到结束 局部/全局 不能和extern关键字联用;修饰局部变量时,会将修饰的局部变量的生命周期延长,即当函数结束时,该局部变量依然存在
register CPU中的寄存器 本地 所属函数从开始到结束 局部 告诉编译器将其修饰的变量存储在CPU中的寄存器中
未初始化数据段与已初始化数据段

未初始化数据段,又叫.bss段,存放的是未初始化的全局变量和未初始化的静态局部变量;已初始化数据段,又叫.data段,存放的是已经初始化的全局变量和已经初始化的静态局部变量

特征修饰

特征修饰符一共有两个,一个是const,其把修饰的变量访问权限设置为只读。 另一个是volatile

volatile

volatile意为“易变的”,它的作用是告诉编译器不要优化其修饰的变量在内存中的存取。对于CPU而言,它访问内存的速度是慢于访问寄存器变量的速度的,多次访问内存会导致效率下降。因此,对于如何提高CPU效率,有三种做法,硬件上的做法是使用多级缓存,而程序员可以做的则是对代码的优化,然后编译器能做的则是编译器优化。 比如,定义了变量a,b,c,并分别把a赋给b,c
	int a = 1;
	int b,c;
	b = a; //a在内存中的位置->寄存器;
	       //寄存器->b在内存中的位置
	c = a;//a在内存中的位置->寄存器;(这一步可以省略)
	       //寄存器->c在内存中的位置

编译器优化后会将变量a临时在寄存器中备份,避免每次都从内存中取一次a的值,从而提高程序效率。如果将a声明为volatile,那么编译器便不会这样优化,从而不会将a的值备份进寄存器里,因此每次仍然需要在内存中读取a的值。

使用场景

  1. 多线程可能改变变量的值
  2. 外部中断程序可能改变变量的值
  3. 硬件寄存器的值可能随时会改变