如果char的对齐要求比int更严格,这个联合体是否能正常工作?

8

最近我发现了以下片段,它试图确保i的所有字节(而不是更多)都可以作为c的单个元素访问:

union {
  int i;
  char c[sizeof(int)];
};

现在这似乎是一个好主意,但我想知道标准是否允许 char 的对齐要求比 int 更严格的情况。
换句话说,是否可能有一个需要在四字节边界上对齐的四字节 int 和一个需要在十六字节边界上对齐的一字节 char(按定义是一字节,见下文)?
这会影响上面的联合使用吗?
需要注意两点:
1. 我在这里特别讨论标准允许什么,而不是理智的实现者/架构提供什么。 2. 我在使用 "byte" 一词时是指 ISO C 中的意义,即它是一个 char 的宽度,不一定是 8 位。
2个回答

7

没有任何类型的对齐要求可以比其大小更严格(由于数组的工作原理),而sizeof(char)等于1。

如果不明显:

  • sizeof(T [N])等于sizeof(T)*N
  • sizeofchar为单位; 所有类型都表示为固定数量的字节(char),该数字为其大小。 有关详细信息,请参见6.2.6 (类型的表示)。
  • 对于T A [2];(char *)&A [1] - (char *)&A [0]等于sizeof A [0]
  • 因此,T的对齐要求不大于sizeof(T)(实际上它除以sizeof(T)

你需要引用ISO标准来说服我,R。如果你使用对齐方式而不是大小自动缩放a[i]a+i,会导致数组的哪个特定功能无法正常工作? - paxdiablo
@paxdiablo: 那么这个就行不通了。(void *) a + i * sizeof(*a) - Bill Lynch
1
@sharth - 那样不起作用 - 在void *上进行指针算术运算是不允许的。 - Chris Lutz
2
@paxdiablo:阅读6.2.6类型的表示。所有类型都以“char”为单位表示。数组的大小是元素数量乘以元素类型的大小。等等等等。这些都非常基础。 - R.. GitHub STOP HELPING ICE
1
@pax 标准规定数组不能有填充,并且必须是连续的。因此,R所说的完全正确。 - SiegeX
显示剩余3条评论

2
请看这个讨论串。在那里,我质疑了C语言联合体的实用性,并有一些有趣的见解。重要的是,标准根本不保证不同字段的对齐方式!编辑:paxdiablo,我刚注意到您是回答该问题的人之一,所以您应该很熟悉这个限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接