4.7 C语言的存储类,作用域,生命周期,链接属性
C语言背后的运行机制,学会了会对C语言更加熟悉,可以直接看到C语言的骨头里去。
存储类(storage class):
①什么是存储类?
存储类就是变量存储类型,即变量在内存中存储在什么段。
例如:栈:普通局部变量。
数据段(.data):初始化不为零的全局变量,静态局部变量。
bss段:初始化为零 或 未初始化的全局变量。 (其实bss段就是初始化为0的数据段)
代码段(.text):存放程序执行代码的一块内存区域。
②存储类相关的关键字?
auto static register extern volatile restrict typedef
详解:
auto:作用: 是修饰局部变量。 存储类:局部变量存储在栈上。栈有四个特性:反复使用;脏内存;临时性;栈会溢出;
static: 作用:首先static有两个作用(平时记得不是很清楚),
①修饰局部变量,成为静态局部变量。
什么是静态局部变量? 答: 静态局部变量是带static修饰的普通局部变量;
静态局部变量存储在哪儿? 答: 静态局部变量存储在数据段;
为什么会有静态局部变量? 答:
静态局部变量 它和非静态局部变量有什么区别? 答:静态局部变量存储在数据段/bss段。非静态局部变量分配在栈上。由于静态局部变量分配在数据段、bss
段,所以允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值
0,字符型变量赋空字符。
②修饰全局变量,成为静态全局变量。
全局变量和静态全局变量的区别:链接属性不同,
ps:静态局部变量和全局变量的区别:
相同点:
静态局部变量和全局变量存储类相同,都是存储在数据段/bss段
静态局部变量和全局变量的生命周期相同,都是伴随着整个源程序。
不同点:
作用域:静态局部变量是代码块作用域(和自动局部变量一样)。而全局变量是文件作用域(和函数一样)。
链接属性:静态局部变量无链接。而全局变量是外链接。
register: 作用:把修饰的变量尽可能的储存到寄存器中。
①为什么要放到寄存器中? 答:平时变量是存储在内存中的,加上register后,会尽量放在寄存器中,因为寄存器和内存相比,寄存器里CPU近,
所以访问变量的速度更快。
说明:数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存
放到内存里,CPU 不直接和内存打交道。
②有什么好处?有什么缺陷? 答:好处是CPU里寄存器近,register修饰的变量用在那种变量被反复高频率的使用,通过改善这个变量的访问效率可以极
大的提升程序运行效率时。所以register是一种极致提升程序运行效率的手段。
缺陷:CPU的寄存器本来就很少,而且是尽可能的将变量分配到寄存器中。所以平时定义register变量要慎用。
extern: 作用:主要是修饰
volatile:
restrict:
typedef:
总结: 存储类的出现也是因为操作系统对内存的管理机制所导致的,变量会存储在不同的内存中。
作用域(scope):
①局部变量的代码块作用域;
②函数名和全局变量的文件作用域
③同名变量的掩蔽规则
生命周期(lifetime):