跳转到内容

Ada 编程/属性/'对象大小

来自维基教科书,开放的书籍,开放的世界

对象的尺寸不一定是与对象类型的尺寸相同。这是因为默认情况下对象尺寸会增加到对象的对其的倍数。例如,Natural'Size 是 31,但是默认情况下 Natural 类型的对象将具有 32 位的尺寸。类似地,包含一个整数和一个字符的记录

type Rec is record
   I : Integer;
   C : Character;
end record;

将具有 40 的尺寸(即 Rec'Size 将为 40)。对其将为 4,因为整数字段,因此此类型记录对象的默认尺寸将为 64(8 字节)。

如果上述记录的对齐指定为 1,则对象尺寸将为 40(5 字节)。默认情况下这是正确的,并且在这种情况下也可以显式地指定 40 的对象尺寸。

此功能的一个结果是,可以为本来在 Ada 中被认为是静态匹配的子类型赋予不同的对象尺寸。但将此类子类型视为静态匹配毫无意义。因此,GNAT 向静态匹配规则添加了一条规则,要求对象尺寸匹配。考虑以下示例

procedure BadAVConvert is
 2.    type R is new Integer;
 3.    subtype R1 is R range 1 .. 10;
 4.    subtype R2 is R range 1 .. 10;
 5.    for R1'Object_Size use 8;
 6.    for R2'Object_Size use 16;
 7.    type R1P is access all R1;
 8.    type R2P is access all R2;
 9.    R1PV : R1P := new R1'(4);
10.    R2PV : R2P;
11. begin
12.    R2PV := R2P (R1PV);
               |
       >>> target designated subtype not compatible with
           type "R1" defined at line 3

13. end;

在没有第 5 行和第 6 行的情况下,类型 R1R2 静态匹配,因此第 12 行的转换是合法的。但是,由于第 5 行和第 6 行导致对象尺寸不同,GNAT 认为类型 R1R2 不进行静态匹配,第 12 行将生成上面显示的诊断。

在其他需要静态匹配子类型的上下文中也会执行类似的额外检查。

华夏公益教科书