register关键字请求编译器尽可能地将变量存在CPU内部寄存器中,而不是通过内存寻址访问以提高效率。
使用register修饰符有几点限制:
- register变量必须是能被CPU所接受的类型。
这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。
因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
void main()
{
register int a = 0;
int *p = &a; //错误
}
只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量、结构体、共用体内部变量)不行。特别地,静态局部变量不能定义为寄存器变量。 ```c struct STRUCT_NAME { register int a; //错误 };
union UNION_NAME { register int b; //错误 };
register int c; //错误
void main() { register static int d = 0; //错误 } ```
- 由于寄存器的数量有限,不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,任何多余的register修饰符都将被编译程序所忽略。