C 语言 register 关键字

2024 年 8 月 28 日 | 3 分钟阅读

C 语言程序中的所有变量都有一个内存地址并存储在内存中。然而,register 关键字表示编译器应该将变量存储在 CPU 寄存器中而不是内存中。如果你不知道,处理器只有一定数量的通用寄存器,并且 CPU 在对数据执行任何算术逻辑操作之前会将所有变量加载到这些寄存器中。寄存器明显比内存快,CPU 的访问时间也更短。因此,我们将程序中经常使用的变量与 register 关键字配对使用。换句话说,register 关键字指示编译器将变量保存在处理器寄存器中,以便快速访问它。但是,编译器会决定是将其保存在内存中还是处理器寄存器中。

如何使用 register 关键字?

你只需要在变量中包含 register 关键字,即可将其变为寄存器变量。你可以参考以下示例

register 关键字示例

以下示例设置了各种类型的寄存器变量,并使用 print() 显示它们的值

输出

The value of register variable x : B
The value of register variable a : 20
The value of register variable b : 35

我们可以获取寄存器变量的地址吗?

需要记住的一点是,即使编译器选择将变量存储在内存而不是 CPU 寄存器中,如果你在变量中包含了 register 关键字,你也不能使用一元地址运算符 (&) 访问其地址。

根据你的编译器,对寄存器变量使用地址运算符 (&) 将导致警告或错误,因为 CPU 寄存器没有地址,并且在使用 register 关键字时可以用来存储变量而不是内存。请查看以下示例代码及其结果以进行演示

C 语言示例:访问寄存器变量地址

输出

在此示例中,我们的编译器会生成一个错误。但是,有些编译器只发出警告。

main.c: In function 'main':
main.c:5:5: error: address of register variable 'x' requested
     int* ptr = &x;   // pointer to a variable x

带指针变量的 register 关键字

对于指针变量,我们可以像其他数据类型一样使用 register 关键字。在这种情况下,它将有一个内存位置地址。

输出

22

register 变量的作用域

register 关键字只能用于局部变量;全局变量不能使用此关键字。

输出

main.c:3:14: error: register name not specified for 'x'
 register int x = 22;

关于 register 关键字的重要信息

首先,C 标准禁止对单个变量使用多个存储说明符。register 关键字也是 C 语言中的一种存储类。在 C 语言中,有四种不同类型的存储类说明符

  • extern
  • auto
  • static
  • register

因此,我们无法将 register 与 extern、auto 和 static 存储类说明符一起使用。

输出

main.c: In function 'main':
main.c:5:5: error: multiple storage classes in declaration specifiers
     static register int x = 22;