Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Alignment Ada中的对齐子句做什么?_Alignment_Ada - Fatal编程技术网

Alignment Ada中的对齐子句做什么?

Alignment Ada中的对齐子句做什么?,alignment,ada,Alignment,Ada,我不清楚Ada中的对齐子句是做什么的。请参见下面的示例。我有一个40位大小的记录,我不确定当我使用这个子句时会发生什么 type Knots_Status_Record is record Value : Knots; Status : Statuses; end record; for Knots_Status_Record use record Value at 0 range 0 .

我不清楚Ada中的对齐子句是做什么的。请参见下面的示例。我有一个40位大小的记录,我不确定当我使用这个子句时会发生什么

    type Knots_Status_Record is
      record
        Value  : Knots;
        Status : Statuses;
      end record;

    for Knots_Status_Record use
      record
        Value  at 0 range  0 .. 31; -- 32
        Status at 0 range 32 .. 39; -- 8
      end record;

    for Knots_Status_Record'Alignment use 1;
属性对齐 对齐
x
确保地址可被
x

Data'Aligment=x Data'地址mod x=0

含意
  • 某些处理器要求数据地址与特定的对齐方式对齐
  • 如果数据地址对齐,某些处理器访问数据的速度会更快 到特定的路线
示例地址行为
带有Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u IO;
使用Ada.Text_IO;使用Ada.Text\u IO;
具有系统存储单元;使用系统存储单元;
用Ada.Assertions;使用Ada.Assertions;
使用Ada.Command_行;使用Ada.Command_行;
主要程序是
函数Get_参数_1返回自然值为
开始
返回自然值(参数(1));
例外
当others=>使用“缺少自然参数(1)”引发程序_错误时;
结束;
--更改此大小以查看64以下的每个地址对齐发生的情况。
Float_数组_Size:Natural:=Get_参数_1;
类型Float_Array是Float的数组(整数范围1..Float_Array_Size);
F4:浮点数数组;
对于F4'对齐,使用4;
F8:浮点数组;
对于F8'对齐,使用8;
F16:浮点数阵列;
对于F16'对齐,使用16;
F32:浮点数组;
对于F32'对齐,使用32;
F64:浮点数组;
对于F64'对齐,使用64;
开始
--检查4对齐地址是否可以是64对齐地址。
Put(整数(到整数(F4'地址)mod 64));
--有时是,有时不是,部分取决于浮点数组的大小。
新线;
Put(整数(到整数(F8'地址)mod 64));
新线;
Put(整数(到整数(F16'地址)mod 64));
新线;
Put(整数(到整数(F32'地址)mod 64));
新线;
Put(整数(到整数(F64'地址)mod 64));
--让我们看看地址是否与64个存储单元对齐。
断言(整数(到整数(F64'地址)mod 64)=0);
结束;
外部资源

此属性的值为universal_integer类型,且为非负;零表示对象不一定在存储元素边界上对齐。如果X'对齐不是零,则X在存储单元边界上对齐,X'地址是X'对齐的整数倍(即对齐的地址模为零)

GNAT要求所有对齐子句指定2的幂,并且所有默认对齐总是2的幂。默认对齐值如下所示:

X'Alignment是一个Ada属性,其中X是任何内存分配的对象或类型。此属性控制用于对象的地址值。对齐必须是非负对齐。值为零表示不需要在存储单元的边界处分配对象。否则,地址是X对齐的倍数。 可以设置对象的对齐方式


您试过查看吗?基本上,这意味着每个
Knots\u Status\u记录
将在“存储单元”边界上对齐(即在大多数处理器上为字节边界),并且地址将是1的倍数。在这种情况下,这可能没有用处<代码>“对齐”通常用于强制对象在4字节、8字节或64字节边界上对齐(例如),以满足某些硬件要求。@ajb,这是一个答案,而不是注释。我会把它贴出来。