# register
register最初由C语言引入,它建议编译器使用CPU寄存器来存储自动变量。旨在提高访问变量的速度。在C++11之前,这个关键字的用法始终未变,随着硬件和编译器变得越来越复杂,这种提示表明变量用的频繁,编译器可对其做特殊处理。在C++11中,关键字`register` 只是显示地指出变量是自动的。所以有些自动变量本身就是自动变量,用`register` 显示指出基本毫无用处,保留其关键字只是一种情怀。
```C++
register int countFast;
//countFast是一个寄存器变量
```
# const
const和volatile一起被称为cv-限定符。`const` 声明的变量被初始化之后不能再更改其值。默认情况下全局变量的链接性为外部的,但 `const` 修饰的全局变量的链接性为内部的。所以通常将const修饰的常量放在头文件中,每个包含该头文件的都可以使用该常量,不会导致二义性。
- 在不使用extern时,尽可能放入头文件中,若其他文件需要,则包含头文件即可,所有包含该头文件常量的文件不是共享变量,而是内部私有静态变量。
- 在使用extern时,在源文件中使用定义`const int PI=3.1415926`,在头文件声明`extern const int PI`,注意,不能初始化两次。不能在头文件中定义或初始化常变量,因为当其他文件包含该头文件时,会出现二义性。若没有头文件,其他文件想使用该常变量,则可以使用`extern const int PI`,注意,不能赋值。
# volatile
const和volatile一起被称为cv-限定符。当连续读取两次某个变量时,可能编译器经过优化之后会将其值放入寄存器中,这样当再次读取数据时,是从内存中读取数据,内存中值还是原值,但是实际数值已经发生了变化,则程序会出错。也有可能是共享数据,数据在其他程序中被更改,编译器经过优化后读取寄存器值,导致出错。最好的解释就是多线程中的赋值和读值。在变量前加上`volatile` 可以将寄存器cache中的值强制写入到内存中,将多个线程中的变量统一可见。
# mutable
即使结构或类变量为`const` ,其某个成员也可以被修改。
```C++
struct data{
char name[30];
mutable int age;
}
const data wang = {"wangyuedong", 18};
strcpy(wang.name, "hahaha"); //这是不允许的
wang.age++;
//变量wang的const限定符禁止程序修改,但age成员的mutable说明符使age不受这样的限制
```