从 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;
需要吗?
这取决于目标架构吗?
最佳答案
Ada 2012 LRM 对 'Alignment 的定义.
当“对齐方式”与某个类型关联时,该类型的对象的地址必须能被对齐值整除。
因此,在您的定义中,类型 T 的对象可以显式放置,或者由编译器自动分配在地址 800 处,但不是 804 处。
当某些数据类型必须遵守对齐约束(例如从双字(8 字节)边界开始的 double )时,这一点就变得相关。 (这取决于目标体系结构——有些体系结构施加了此类约束,而另一些体系结构则没有。)同样,某些体系结构可能允许多字节值在奇数地址上开始——“对齐使用 1”——但大多数不允许。
在您描述的需要定义与外部定义的布局相匹配的 Ada 布局的情况下,最有可能出现此问题。指定“对齐”可以确保对象和记录组件正确布局以匹配外部源。
但通常,特别是在与 C 接口(interface)时,只需应用约定 aspect或pragma相应的类型定义将确保 Ada 布局自动匹配 C 布局,将所有详细的对齐和填充留给编译器。
关于c - 从 Ada 包装 C 时的结构对齐属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609352/