Ada 中的布尔大小

Boolean size in Ada

在我的 ada 项目中,我有 2 个不同的基本类型库。我发现了两个不同的布尔值定义:

图书馆 A :

type Bool_Type is new Boolean;

图书馆 B :

type T_BOOL8 is new Boolean;
for T_BOOL8'Size use 8;

所以我有一个问题,Bool_Type 使用的尺寸是多少?

编译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 的评论)。有关详细信息,请参阅 here and here

请注意,'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;

因为用于表示类型T_BOOL8的值的位数被强制为8,所以T_BOOL8的打包数组的单个组件的大小也将是8, T_BOOL8_ARRAY 的总大小为 64 位(8 字节)。将此与 Bool_Array_Type.

的 8 位(1 字节)的总长度进行比较

您应该在 the Ada wikibooks entry for 'Size attribute.

中找到您的答案(或足够的信息来找到您的特定问题的答案)

很可能 Bool_Type 具有与布尔值相同的大小,或者类型为 1 位(例如,这意味着您可以将 Bool_Type 元素打包到数组中)和实例为 8 位(四舍五入为完整字节)。

Bool_Type会继承'Size of Boolean,要求为1, 参见 RM 13.3(49)

无论编译器需要什么大小,除非你像库 B 那样覆盖。可能是 8 位,但在某些 32 位 RISC 目标上,32 位可能比 8 位快。在微型微控制器上,1 位可能节省 space.

其他答案让您找出您编译的特定目标。

由于您的布尔值是不同的类型,因此您需要在它们之间进行类型转换,从而为编译器提供挂钩来处理任何格式或大小转换而无需任何进一步的麻烦。