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 行的情况下,类型 R1
和 R2
静态匹配,因此第 12 行的转换是合法的。但是,由于第 5 行和第 6 行导致对象尺寸不同,GNAT 认为类型 R1
和 R2
不进行静态匹配,第 12 行将生成上面显示的诊断。
在其他需要静态匹配子类型的上下文中也会执行类似的额外检查。