【问题标题】:Determining portably the most restrictive data type for alignment确定可移植性最严格的对齐数据类型
【发布时间】:2014-01-24 06:36:33
【问题描述】:

如果我没有忽略某些内容,则选择 uintmax_t 可以处理整数情况。

(1) 浮点数是否有类似的数据类型,如果有,在哪个标头中? (对我来说它不在 float.h 中)

(2) 选择这两种数据类型的并集是否正确(假设我们可以肯定地回答 (1))应该始终是最严格的?

【问题讨论】:

  • 在“确定可移植性”中,在 given 平台上找到最严格的对齐方式可能无法解决更大的问题。也许使用“最严格的数据类型”的代码示例会有所帮助?
  • @chux:以书中旧的 K&R 最后一个例子:重新创建 malloc。他使用的链表的标题是为了与任意选择的(在他的情况下)“最严格的对齐方式(长)”对齐。我目前正在阅读 Kerrisk TLIP,一个练习是再次实现 malloc。我的意思是利用这个机会使其尽可能便携,并像这样对齐列表。
  • 谢谢 - 很高兴您确保与 OP_malloc() 保持一致,每 §7.22.3 1 内存管理功能“...适当对齐,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针..."。

标签: c linux alignment posix


【解决方案1】:

正如 Eric 的回答中所指出的,C11 在<stddef.h>:max_align_t 中定义了具有最大基本对齐的对象类型。

但是请注意,这在 GCC 上可能仍无法按预期工作。取自 gcc 的网站:

C 标准的第四个版本,称为 C11,发布于 2011 年作为 ISO/IEC 9899:2011。 GCC 基本上完全支持 此标准通过 -std=c11 或 -std=iso9899:2011 启用。 (而在 开发中,这个标准版本的草案被称为 C1X。)

如果由于 C11 的新鲜和目前缺乏支持而不想依赖它,我建议定义一个包含所有整数类型、所有浮点类型、一个 void 指针和一个函数指针的联合:其中之一必须是最严格的类型。

【讨论】:

  • 不同的指针类型不需要具有相同的对齐要求,尽管它们在大多数 C 实现中都是如此。
  • 我在 gcc 4.6.3 上,并且 -std=c11 无法识别。如果没有人指出像 (u)intmax_t 这样的浮点数,我想你建议的解决方案是要走的路。
  • @EricPostpischil true,但出于 OP 的目的,它可以工作:因为任何数据指针都可以转换为 char *(出于历史原因)或 void * 并安全返回,那么这些指针类型具有最严格的对齐要求(第 6.1 节 C:参考手册确认了这一点)
  • @FilipeGonçalves:指针可以转换为void * 并返回,这意味着void * 包含原始的所有信息。它没有任何关于对齐的含义。例如,考虑一个基于字的内存的实现,其中指向int 的指针只有一个字地址,并且非常适合某个内存单元。那么int * 就会有这个内存单元的对齐要求。但是void * 需要一些额外的位。在这种情况下,实现必须选择对齐两个单位(浪费内存)或使用一个和一个分数单位(成本性能)。
【解决方案2】:

实现支持的具有最大基本对齐的对象类型是max_align_t,在<stddef.h> 中定义。

我没有在标准中看到规定联合的对齐要求必须是其成员最严格的对齐要求的文本。因此,从理论上讲,工会可能需要比其任何成员都需要的更严格的联盟。我看不出有什么理由,也不指望 C 实现会这样做。通常情况下,联合的对齐要求是其成员最严格的要求,除非程序明确要求更大的对齐(如 _Alignas 关键字)。

【讨论】:

  • max_align_t 来自 C11。
  • 那将是完美的;但是当我包含 stddef.h,然后在一个玩具程序中声明一个这样的变量并尝试打印它时,gcc 报告未知类型名称错误。想法?
  • @Palec:C 现在是 C 2011; 2011 年标准“取消并替换了第二版 ISO/IEC 9899:1999”。如果有人想询问 C 的早期版本,他们应该明确说明。
  • 我的 glibc 版本是 2.15。这是否说明它是否支持 C11?如果不是,如何检查?或者,如果我的系统目前不支持 C11,那么在 C99 下是否有替代的操作系统?
  • @FilipeGonçalves,不,不要将 gcc 与 -std=c11 一起使用。 C11 支持不完整,gcc 无法让您检测到它支持的不同 C11 功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2012-11-14
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多