朱有鹏
1、存储类相关的关键字1
1.1、auto
(1)auto关键字在C语言中只有一个作用,那就是修饰局部变量。
(2)auto修饰局部变量,表示这个局部变量是自动局部变量,自动局部变量分配在栈上。(既然在栈上,说明它如果不初始化那么值就是随机的······)
(3)平时定义局部变量时就是定义的auto的,只是省略了auto关键字而已。可见,auto的局部变量其实就是默认定义的普通的局部变量。
#include auto var1=20;//错误 int main() { auto int var2=15;//等价于int var2=15; printf("var%d\\n return0; } 1.2、static关键字 (1)static关键字在C语言中有两种用法,这两种用法之间没有任何关联,是完全是的。也许当年本应该多发明一个关键字,但是C语言的作者觉得关键字太多不好,于是给static增加了一种新用法,导致static一个关键字竟然有两种截然不同的含义。 (2)static的第一种用法:用来修饰局部变量,形成静态局部变量。 (3)static的第二种用法:用来修饰全局变量,形成静态全局变量。 本节重点分析第一种用法,因为第二种用法涉及到链接域的问题在7.7节才涉及。 静态局部变量和自动局部变量(auto)的区别。本质区别是存储类不同,自动局部变量分配在栈上,而静态局部变量分配在data或者bss段上。 静态的局部变量和全局变量的相似处: 1、静态局部变量在存储类方面(数据段)和全局变量一样。 2、静态局部变量在生命周期方面,和全局变量一样。 静态局部变量和全局变量的区别是 作用域、链接属性不同。静态局部变量作用域是代码块作用域(和自动局部变量是一样的)、链接属性是无连接(后面会详细讲);全局变量作用域是文件作用域(和函数是一样的)、链接属性方面是外连接(后面会详细讲到)。 1.3、register (1)register关键字不常用,当register修饰的变量时,编译器会将它分配在寄存器中,平时变量空间都是分配在内存中。Register修饰的被称为寄存器变量,和普通变量的使用方式没有什么区别,但是寄存器变量的读写效率会高很多,所以对那些读写频率很高的变量来说,使用regixter关键字将其变为寄存器变量,可以很好的提高其访问效率。 比如在我们的uboot中就用到了一个register类型的变量,因为这个变量在整个uboot中被使用的频率很高,为了提高效率,因此将其定义成为了register变量。平时写代码要被定义成register这种情况很少,一般慎用。编译的过程中,编译器只能承诺尽量将register修饰的变量放在寄存器中,但是不保证一定放在寄存器中。主要原因是因为寄存器数量有限,不一定能够分配的上。 摘取自【朱有鹏c语言内核深度解析】下载本文