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

标签 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;

需要吗?

这取决于目标架构吗?

最佳答案

Ada 2012 LRM 对 'Alignment 的定义.

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

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

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

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

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

关于c - 从 Ada 包装 C 时的结构对齐属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609352/

相关文章:

C++ 基础 vector 指派生 vector

shell - 如何从 Ubuntu 命令行中删除 Maven Wrapper?

c - 找到小于给定整数的最大有趣数

使用函数指针在测试程序中编译错误

c - 将 var 分配给 var - 它会起作用吗?

css - 将着陆页上居中对齐的图像链接到另一个页面

javascript - 如何在 Qooxdoo 中对齐图像?

c++ - 创建一个 QML 插件来运行系统命令?

c - 这种情况下如何实现信息隐藏呢?

python - 如何获得两个列表的对齐输出?