volatile
对一个变量的数据进行操作的时候:
将变量数据从内存加载到cpu寄存器。
若编译程序的时候,进行了代码优化,则会对使用度极高的数据,直接加载到寄存器,以后访问的时候直接从寄存器获取,提高程序性能。
这时候若我们修改了变量的值,在内存中数据已经改变,但cpu这时候并不重新到内存中获取这个数据。
修饰某个变量,表明某个变量的值可能随时被外部改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取,从变量的地址中(内存中)读取数据。
volatile的作用是告知编译器,它修饰的变量随时都可能被改变。因此,编译后的程序每次在使用该变量的值时,都会从变量的地址中读取数据,而不是从寄存器中获取。
- 作用:在进行编译时不优化,在执行的时候不缓存, 每次都需要从内存中读出(保证内存的可见性)
- 防止编译器过度优化,保持内存可见性。每次访问数据都需要从内存中重新获取
- 场景:多用于多线程或多CPU编程
int a=1;
void sigcb(int signo)
{
a=0;
}
int main()
{
signal(SIGINT,sigcb);
while(a)
{
}
printf("over\n");
}
static和const
static和const
static关键字至少有下列几个作用:
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
const关键字至少有下列几个作用:
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左
值”。
extern
extern:声明外部的全局变量,extern只是用来声明不用来实现。
简单的理解就是,若一个变量需要在同一个工程中不同文件直接使用或修改,则需要将自变量做extern声明。只需将该变量在其中一个文件中定义,然后在另外一个文件中使用extern声明,且两个变量类型需一致。
在1.c中定义全局变量
int i;
在2.c和3.c中都用
extern int i;
声明一下就可以使用了
在定义函数时如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。在文件中要调用其他文件中的外部函数,则需要在文件中用extern声明该外部函数,然后就可以使用。