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 行將生成上面顯示的診斷。
在其他需要靜態匹配子型別的上下文中也會執行類似的額外檢查。