跳轉到內容

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 行將生成上面顯示的診斷。

在其他需要靜態匹配子型別的上下文中也會執行類似的額外檢查。

華夏公益教科書