跳转到内容

Ada 编程/属性/'Ref

来自维基教科书,自由的教科书

’REF 表示分配给对象的首个存储单元的有效地址。’REF 不支持包、任务单元或条目。此属性的两种形式是 X’REF 和 SYSTEM.ADDRESS’REF(N)。仅在机器代码过程中使用 X’REF。在任何地方使用 SYSTEM.ADDRESS’REF(N) 将整数表达式转换为地址。

此属性生成对应用于其的实体的引用。在 X’REF 中,X 必须是常量、变量、过程、函数或标号。此属性返回 MACHINE_CODE.OPERAND 类型的返回值。仅用它来指定代码语句中的操作数。在代码语句生成的指令之前,添加为简化引用所需的额外指令,例如加载基址寄存器。如果过程的声明部分包含 pragma IMPLICIT_CODE (OFF),则如果需要额外代码,会生成警告。

SYSTEM.ADDRESS’REF(N)

[编辑 | 编辑源代码]

此属性的效果类似于从整数到地址的无检查转换的效果。但是,在以下列出的情况下,请使用 SYSTEM.ADDRESS’REF(N) 而不是无检查转换。在这些情况下,N 必须是静态的。在 SYSTEM.ADDRESS’REF(N) 中,SYSTEM.ADDRESS 必须是类型 SYSTEM.ADDRESS。N 必须是 UNIVERSAL_INTEGER 类型的表达式。此属性返回 SYSTEM.ADDRESS 类型的返回值,该值表示由 N 指定的地址。

  • 对于任何运行时配置包:在地址子句中使用无检查转换需要生成详细说明代码,但配置包不会详细说明。
  • 在 N 大于 INTEGER’LAST 的任何实例中:在引用内存上半部分的地址子句中需要此类值。要在这些情况下使用无检查转换,需要将表达式指定为负整数。
  • 要将对象放置在地址处,请使用 ’REF。

在以下示例中,integer_value 转换为地址,以便在地址表示子句中使用。此形式避免了 UNCHECKED_CONVERSION,并且对于 32 位无符号地址很有用。

--place an object at an address
for object use at ADDRESSREF (integer_value)
--to use unsigned addresses
for VECTOR use at SYSTEM.ADDRESSREF(16#808000d0#);
TOP_OF_MEMORY : SYSTEM.ADDRESS := SYSTEM.ADDRESSREF(16#FFFFFFFF#);
华夏公益教科书