寄存器存储类说明符

register 存储类说明符向编译器指示对象应存储在机器寄存器中。 通常为大量使用的变量 (例如循环控制变量) 指定 register 存储类说明符,希望通过最大限度缩短访问时间来提高性能。 但是,不需要编译器来满足此请求。 由于大多数系统上可用的寄存器的大小和数量有限,因此实际上很少有变量可以放入寄存器中。 如果编译器没有为 register 对象分配机器寄存器,那么该对象将被视为具有存储类说明符 auto

具有 register 存储类说明符的对象必须在块中定义或声明为函数的参数。

以下限制适用于 register 存储类说明符:

  • 仅限 C 不能使用指针引用具有 存储类说明符的对象。 register
  • 仅限 C 当在全球范围内声明对象时,不能使用 存储类说明符。 register
  • 仅限 C 登记簿没有地址。 因此,不能将地址运算符 (&) 应用于 register 变量。
  • 仅限 C + + 在命名空间范围内声明对象时,不能使用 存储类说明符。 register
仅限 C + + 与C语言不同,C++允许您使用 存储类获取对象的地址。 register 例如:
   register int i;
   int* b = &i;      // valid in C++, but not in C

寄存器变量的存储持续时间

具有 register 存储类说明符的对象具有自动存储持续时间。 每次输入块时,该块中定义的 register 对象的存储器都可用。 当块退出时,这些对象不再可供使用。

如果在递归调用的函数中定义了 register 对象,那么 将在每次调用块时分配新对象

寄存器变量的链接

由于 register 对象被视为等同于 auto 存储类的对象,因此它没有链接。

指定寄存器中的变量(IBM 扩展)

您可以使用 asm 寄存器变量 声明来指定特定硬件寄存器专用于变量。 提供此语言扩展是为了与 GNU C 兼容。

全局寄存器变量在整个程序中保留寄存器; 永远不会删除存储到保留寄存器中。

本地寄存器变量实际上不会保留寄存器,除非这些变量用作内联组合件语句中的输入或输出操作数。 在这种情况下,使用变量作为 asm 操作数保证指定的寄存器用于操作数,是控制使用哪个寄存器的方便方法。

注册变量声明语法

读取语法图跳过可视语法图register变量声明 asm__asm____asm(" 注册说明符")
register_说明符 是表示硬件寄存器的字符串。 寄存器名称是特定于 CPU 的。 以下是有效的注册名称:
r0 到 r31
通用寄存器
f0 到 f31
浮点寄存器
v0 到 v31
向量寄存器 (在所选处理器上)
以下是寄存器变量的使用规则:
  • 不能为以下类型的变量保留寄存器:
    • long long 类型
    • 聚集类型
    • 仅限 C + + 班级类型
    • 仅限 C + + 参考类型
    • 空类型
    • _Complex 类型
    • 128 位 long double 类型
    • 十进制浮点类型
  • 只能为整数或指针类型的变量保留通用寄存器。
  • 只能为 floatdouble或 64 位 long double 类型的变量保留浮点寄存器。
  • 只能为向量类型的变量保留向量寄存器。
  • 无法初始化全局寄存器变量。
  • 专用于全局寄存器变量的寄存器不应是易失性寄存器,或者存储在全局变量中的值可能不会在函数调用中保留。
  • 多个寄存器变量可以保留同一个寄存器; 但是,这两个变量成为彼此的别名,这将被诊断为警告。
  • 同一全局寄存器变量不能保留多个寄存器。
  • 不应在 OpenMP 子句或 OpenMP 并行区域或工作共享区域中使用寄存器变量。
  • 全局寄存器声明中指定的寄存器仅在指定了寄存器声明的编译单元中为声明的变量保留。 除非将全局寄存器声明放在公共头文件中,或使用 -qreserved_reg 编译器选项,否则此寄存器不会保留在其他编译单元中。
C++11
注: 在 C++11中不推荐使用 register 存储类说明符。