Ada中的布尔值大小

A.P*_*cat 2 boolean ada

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

图书馆A:

type Bool_Type is new Boolean;
Run Code Online (Sandbox Code Playgroud)

图书馆B:

type T_BOOL8 is new Boolean;
for T_BOOL8'Size use 8;
Run Code Online (Sandbox Code Playgroud)

所以我有一个问题,它的大小是Bool_Type多少?

egi*_*lhh 9

Bool_Type将继承'的大小Boolean,要求为1,请参阅RM 13.3(49)

  • “'Size'是保存该类型的值所需的最小位数。[GNAT特殊的''Object_Size'](https://gcc.gnu.org/onlinedocs/gnat_rm/Attribute-Object_005fSize.html#Attribute-Object_005fSize)可能更像OP所期望的。 (4认同)

Dee*_*Dee 7

使用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;
Run Code Online (Sandbox Code Playgroud)

编译器输出(部分):

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;
Run Code Online (Sandbox Code Playgroud)

程序输出

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
Run Code Online (Sandbox Code Playgroud)

可以看出,'Size/ 'Value_Size属性所返回的数字Bool_Type等于1(按RM的要求;请参见e​​gilhh的答案)。属性'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;   
Run Code Online (Sandbox Code Playgroud)

编译器输出(部分):

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;
Run Code Online (Sandbox Code Playgroud)

因为用于表示type值的位数T_BOOL8强制为8,所以T_BOOL8s 的打包数组的单个组件的大小也将为8,并且s的总大小T_BOOL8_ARRAY将为64位(8字节)。将此与的8位(1个字节)的总长度进行比较Bool_Array_Type