从Ada包装C时的结构对齐属性

时间:2012-11-28 16:06:31

标签: c alignment wrapper ada structure

从Ada包装C结构时,Ada类型属性Alignment何时需要?

我们典型的包装结构看起来像

type T is record
  a : aliased Interfaces.C.unsigned_char;
  b : aliased Interfaces.C.double;
end record;

现在,何时/何地

for T'Alignment use 8;

需要的?

这取决于目标架构吗?

2 个答案:

答案 0 :(得分:3)

Ada 2012 LRM对'Alignment的定义。

当“对齐”与某个类型相关联时,该类型对象的地址必须能够被对齐值整除。

因此,在您的定义中,类型为T的对象可以显式放置,或者由编译器自动分配,地址为800,但不是804。

当某些数据类型必须遵守对齐约束(例如从双字(8字节)边界开始的双精度数)时,这变得相关。 (这取决于目标体系结构 - 有些会施加这样的约束,有些则没有。)同样,某些体系结构可能允许多字节值从奇数地址开始 - “对齐使用1 - 但大多数不是。”

在您描述需要定义与外部定义的Ada布局匹配的位置时,最有可能出现此问题。指定'对齐可以确保正确布置对象和记录组件以匹配外部源。

通常,特别是在与C接口时,只需将约定aspectpragma应用于相应的类型定义,即可确保Ada布局自动匹配C布局,并保留所有详细的对齐和填充到编译器。

答案 1 :(得分:2)

对齐属性的目的不是支持C兼容性,提供与对其数据具有特殊对齐限制的硬件(包括某些CPU的一些数据,最常见的是浮点数和FPU)的兼容性是非常好的。

话虽如此,从技术上讲,我认为在您了解C编译器使用的对齐规则时,如果您尝试使Ada代码与之兼容,则它可能对C兼容性很有用。

在这种特殊情况下,我怀疑会发生什么情况,编译器会确保T类型的所有对象都以四字边界布局。但是,编译器可能会选择在T对象的中间放置七个填充字节,以确保double也放在四字边界上。如果不用强制记录表示条款,你也不能说真的。如果你关心如何布局记录结构的内部结构(例如:你想确保它与某些C布局匹配),你可能应该明确它。