C语言中的auto, static, const, extern, register, restrict, volatile 关键字

auto关键字。。。待写。。。

static关键字。。。待写。。。

const关键字。。。待写。。。

extern关键字。。。 待写。。。

restrict和volatile,两者都是为了方便编译器的优化。

restrict关键字只用于修饰指针类型,它告诉编译器,所有要修改 该指针指向的内容 的操作,都必须是基于该指针的。

额。。。 其实我还是没弄懂这个关键字的实际应用在哪,尽管理解了上面的说法。

注意:restrict是C99中新增的关键字,在C89和C++中都不支持,在gcc中可以通过 "$ cc -std=c99 XXX.c"来得到对它的支持。

volatile关键字告诉编译器该被变量除了可被程序修改以外还可能被其他外部进程修改。程序在使用变量时, 特别是连续多次使用变量时, 一般是载入寄存器, 直接从寄存器存取, 之后再还回内存;但如果此变量在返回内存时, 假如内存中的值已经改变了(从外部修改了)怎么办?

因此,当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不是使用寄存器中的缓存。比如
val1=x;
val2=x;
如果没有声明volatile,系统在给val2赋值的时候可能直接从寄存器读取x(假定聪明的编译器优化了),而不是从内存的初始位置,那么在两次赋值之间,x完全有可能被被某些编译器未知的因素更改(比如:操作系统、硬件或者其它线程等)。如果声明为volatile,编译器将不使用缓存,而是每次都从内存重新读取x。

原文地址:https://www.cnblogs.com/funway/p/1978656.html