register关键字用于修饰变量,被其修饰的变量称为寄存器变量。
register关键字请求编译器尽可能地将变量存储在CPU内部寄存器中,而不是传统的通过内存寻址访问。这样做的好处是可以提高访问效率,访问变量速度更快。
由于CPU的寄存器数量有限,因此register关键字修饰的变量是尽可能存储在寄存器中,并不是一定会存储在寄存器,这取决于编译器的分配。
因为寄存器变量存放在寄存器中,因此有如下特性需要注意:
-
register变量必须是能被CPU所接受的单值类型(整型、指针类型、浮点类型等),并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。
-
寄存器内没有地址,register变量不能用“&”来获取变量的地址。
-
只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。
#include <stdio.h>
#include <stdlib.h>
//register int val_1 = 1; // error: register name not specified for 'val_1'
int main()
{
register int val_2 = 2;
//int *p_val_1 = &val_2; //error: address of register variable 'val_2' requested
register double val_3 = 3.14; // right
int val_4 = 4;
register int *p_val_2 = &val_4; //right
return 0;
}