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

pax*_*blo 8 c iso alignment unions

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

union {
  int i;
  char c[sizeof(int)];
};
Run Code Online (Sandbox Code Playgroud)

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

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

这会填补上面联盟的使用吗?

有两点需要注意.

  1. 我正在特别谈论标准允许的内容,而不是一个理智的实现者/架构将提供什么.

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

R..*_*R.. 7

没有类型可以具有比其大小更严格的对齐要求(因为数组如何工作),并且sizeof(char)是1.

如果不明显:

  • sizeof(T [N])sizeof(T)*N.
  • sizeof以...为单位char; 所有类型都表示为固定数量的bytes(char),该数字是它们的大小.有关详细信息,请参见6.2.6(类型表示).
  • 给定T A[2];,(char *)&A[1] - (char *)&A[0]等于sizeof A[0].
  • 因此对齐要求T不大于sizeof(T)(事实上​​它是分开的sizeof(T))

  • @paxdiablo:阅读6.2.6类型表示.所有类型都以`char`为单位表示.数组的大小是元素的数量乘以元素类型的大小.等等等.这都是非常基本的. (2认同)