8

最近我遇到了以下代码片段,它试图确保i(nad no more) 的所有字节都可以作为 的单个元素访问c

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

现在这似乎是个好主意,但我想知道标准是否允许对齐要求charint.

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

这是否会影响上述联合的使用?

有两点需要注意。

  1. 我在这里专门谈论标准允许的内容,而不是理智的实施者/架构将提供的内容。

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

4

2 回答 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)
于 2010-12-21T05:26:43.313 回答
2

看看这个线程。在那里,我质疑 C 联合的有用性,并且有一些有趣的见解。重要的是标准根本不保证不同字段的对齐!

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

于 2010-12-21T06:07:10.443 回答