C语言中主要的关键字有register,static,extern,const等等,下面来一一介绍他们
在介绍register之前,我们先来了解一下计算机和cpu的结构
计算机的三大组成:
CPU,硬盘,内存
CPU的三大组成:
运算器,控制器,存储器(主要指寄存器)
一、register
1.作用:请求编译器尽可能的将变量存在CPU的内部寄存器中,这样可以省去CPU从内存中抓取数据的时间,可以提高执行效率
2.什么时候使用:通常用来定义频繁访问的变量
3.注意事项:
①只能用来修饰局部变量,不能修饰全局变量
原因:全局变量可以被多个进程访问,如果被定义为register型,只有当前进程可以知道该变量保存的位置,其它进程会不知道这个变量保存的位置
②不能用“&”来获取这个变量的地址
原因:“&”获取的是内存的地址,而register型变量保存在CPU的寄存器中
③一定要是CPU可以接受的数据类型
二、static
1.既能修饰变量,也能修饰函数
①修饰局部变量:延长局部变量的生命周期,试其在程序结束后再释放
②修饰全局变量:只在本文件中可见,其他文件中不可见
③修饰函数:只能在本文件中调用,不能被其他文件调用
2.什么时候使用:想让一个局部变量执行完不立即释放
3.与全局变量相比,起到保护变量的作用,原因是全局变量对程序中所有进程可见,任何进程都可以修改
4.其定义的变量保存在静态数据区
三、extern
1.外部声明变量,是指当前变量或函数不是在本源文件中声明的
2.在定义时一定要标注变量的类型
四、const
1.const修饰的变量称为只读变量
以const int num = 5 为例
num对应的空间是可变的,但是不能通过const修饰的变量名(即const)来修改其值
2.注意事项:
要对变量做初始化,否则后面会不能修改其值
3.函数形参前加const的作用:
防止函数对实参的值进行修改
五、typedef
1.作用
为一种数据类型定义一个新名字
2.优点
①提高代码的移植性
②方便定义变量(简化复杂的类型声明)
③可以解释某些变量,对变量起到注释作用
六、Volatile
1.作用:作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile 变量是随时可能发生变化的,提醒编译器与volatile变量有关的运算,不要进行编译优化,以免出错。简单地说就是防止编译器对代码进行优化。
2.什么时候使用
①告诉compiler不能对这个变量做任何优化
②表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用
七、Inline
1.作用
将一个函数定义为内联函数,将函数内部的实现直接搬到调用语句之后,提高执行效率
2.注意事项:
①关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用
②定义在类声明之中的成员函数将自动地成为内联函数
③不是所有情况都适合使用内联函数
以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了 inline 不应该出现在函数的声明中)。