2

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

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

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

现在,何时/何地

for T'Alignment use 8;

需要吗?

这是否取决于目标架构?

4

2 回答 2

3

Ada 2012 LRM 对“对齐”的定义。

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

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

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

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

通常,特别是在与 C 接口时,简单地将约定方面pragma应用于相应的类型定义将确保 Ada 布局自动匹配 C 布局,将所有详细的对齐和填充留给编译器。

于 2012-11-28T16:55:25.123 回答
2

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

话虽如此,从技术上讲,我认为在您知道 C 编译器使用的对齐规则的情况下,它可能对 C 兼容性很有用,而您正试图使您的 Ada 代码与之兼容。

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

于 2012-11-29T15:54:19.733 回答