如果char具有比int更严格的对齐要求,那么这个联合会工作吗?

时间:2010-12-21 05:23:55

标签: c alignment iso unions

最近我遇到了以下代码段,这是为了确保i的所有字节(不再是nad)可以作为c的单个元素访问:

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

现在这似乎是一个好主意,但我想知道标准是否允许char的对齐要求比int的对齐要求更具限制性。

换句话说,是否可能有一个四字节的int,需要在一个四字节的边界上与一个字节char对齐(根据定义,它是一个字节,见下文)需要在16字节边界上对齐吗?

这会不会影响上面联盟的使用?

有两点需要注意。

  1. 我在具体谈论标准允许的内容,而不是一个理智的实现者/架构会提供什么。

  2. 我在ISO C意义上使用术语“字节”,它是char的宽度,不一定是8位。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

看看this thread。在那里,我质疑C联盟的用处,并且有一些有趣的见解。重要的是标准不能确保不同字段的对齐!

编辑:paxdiablo,刚刚注意到你是回答这个问题的人之一,所以你应该熟悉这个限制。