在我的ada项目中,我有2个具有基本类型的不同库。我为布尔值找到了两个不同的定义:
图书馆A:
type Bool_Type is new Boolean;
图书馆B:
type T_BOOL8 is new Boolean; for T_BOOL8'Size use 8;
所以我有一个问题,它的大小是Bool_Type
多少?
Bool_Type
将继承'的大小Boolean
,要求为1,请参阅RM 13.3(49)
使用switch -gnatR2
进行编译以查看其表示子句。例如:
main.adb
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
type Bool_Type is new Boolean;
type T_BOOL8 is new Boolean;
for T_BOOL8'Size use 8;
begin
Put_Line ("Bool_Type'Object_Size = " & Integer'Image (Bool_Type'Object_Size));
Put_Line ("Bool_Type'Value_Size = " & Integer'Image (Bool_Type'Value_Size));
Put_Line ("Bool_Type'Size = " & Integer'Image (Bool_Type'Size));
New_Line;
Put_Line ("T_BOOL8'Object_Size = " & Integer'Image (T_BOOL8'Object_Size));
Put_Line ("T_BOOL8'Value_Size = " & Integer'Image (T_BOOL8'Value_Size));
Put_Line ("T_BOOL8'Size = " & Integer'Image (T_BOOL8'Size));
New_Line;
end Main;
编译器输出(部分):
Representation information for unit Main (body)
-----------------------------------------------
for Bool_Type'Object_Size use 8;
for Bool_Type'Value_Size use 1;
for Bool_Type'Alignment use 1;
for T_Bool8'Size use 8;
for T_Bool8'Alignment use 1;
程序输出
Bool_Type'Object_Size = 8
Bool_Type'Value_Size = 1
Bool_Type'Size = 1
T_BOOL8'Object_Size = 8
T_BOOL8'Value_Size = 8
T_BOOL8'Size = 8
可以看出,'Size
/ 'Value_Size
属性所返回的数字Bool_Type
等于1(按RM的要求;请参见egilhh的答案)。属性'Size
/ 'Value_Size
表示用来表示类型值的位数。'Object_Size
另一方面,该属性等于8位(1个字节),并说明用于在内存中存储给定类型的值的位的数量(请参见Simon Wright的注释)。有关详细信息,请参见此处和此处。
请注意,由'Size
/ 指示的位数'Value_Size
必须足以唯一表示(离散)类型内的所有可能值。对于Boolean
派生类型,至少需要1位,对于具有3个值的枚举类型,例如,您至少需要2位。
定义压缩数组时,可以观察到显式设置'Size
/ 'Value_Size
属性的效果(如G_Zeus的答案所述):
type Bool_Array_Type is
array (Natural range 0 .. 7) of Bool_Type with Pack;
type T_BOOL8_ARRAY is
array (Natural range 0 .. 7) of T_BOOL8 with Pack;
编译器输出(部分):
Representation information for unit Main (body) ------------------------------------------------- [...] for Bool_Array_Type'Size use 8; for Bool_Array_Type'Alignment use 1; for Bool_Array_Type'Component_Size use 1; [...] for T_Bool8_Array'Size use 64; for T_Bool8_Array'Alignment use 1; for T_Bool8_Array'Component_Size use 8;
因为用于表示type值的位数T_BOOL8
强制为8,所以T_BOOL8
s 的打包数组的单个组件的大小也将为8,并且s的总大小T_BOOL8_ARRAY
将为64位(8字节)。将此与的8位(1个字节)的总长度进行比较Bool_Array_Type
。