ANSI C类型限定符
volatile类型限定符
volatile类型限定符限制变量不放进寄存器,该过程称为高速缓存(caching)(进高速缓存的变量的值不可改变),警告编译器不要进行假定的优化。
volatile限定符告知计算机,代理可改变该变量的量。
volatile int locl; /* locl 是一个善变的量*/
volatile int * ploc /*ploc是一个指向易变位置的指针*/
const和volatile 可同时使用, 使变量设置为程序不可改变, 但通过代理可以改变。
restrict类型限定符
只能用于指针, 表明该指针是访问数据对象唯一且初始的方法。使编译器无需去考虑在两次使用指针之间其他的标识符是否已经改变了数据。告知编译器可以进行算法的合并, 优化。
c库中有两个函数用于某位置上的字节的拷贝
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
void *memmove(void * s1, const void * s2, size_t n);
memcpy使用restrict要求两个位置不可重叠, 声明是s1, s2都是访问相应数据的唯一方式。
_Atomic 类型限定符
c11 通过可选的头文件stdatomic.h 和threads.h提供了一些可选的并发程序设计的管理方法。 要通过各种宏函数来访问原子类型, 一个线程对一个原子类型的对象执行原子操作时其他线程不能访问。
int hogs; //普通声明
hogs = 12; //普通赋值
_Atomic int hogs; //hogs是一个原子类型的变量
atomic_store(&hogs, 12); // stdtomic.h中的宏
原子类型hogs中储存12是一个原子过程, 其他线程不可访问。
旧关键字的新位置
c99允许把类型限定符和存储类别说明符static放在函数原型和函数头的形式参数的方括号中。
旧式语法:
void ofmouse(int * const a1, int * restrict a2, int n);
新的等价语法:
void ofmouse(int a1[const], int a2[restrict], int n);
static的用法略微特殊:
double stick(double ar[static 20]);
why?
c用法告知编译器如何使用形式参数。例子表明函数调用的实际参数应该是一个指向数组首元素double型指针, 且该数组至少20个元素。
小结
c的5种存储类别:自动, 寄存器, 静态无链接, 静态外部链接, 静态内部链接。
动态分配的内存由malloc()与其相关函数分配, 使用free()进行释放。
类型限定符const, volatile, restrict和_Atomic.