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

如果char比int有更严格的对齐要求,这个联合会有效吗?,c,alignment,iso,unions,C,Alignment,Iso,Unions,最近我遇到了以下代码片段,它试图确保I(nad nomore)的所有字节都可以作为c的单个元素访问: union { int i; char c[sizeof(int)]; }; 现在这似乎是个好主意,但我想知道该标准是否允许char的对齐要求比int的对齐要求更严格的情况 换句话说,是否可能有一个需要在四字节边界上对齐的四字节int和一个需要在十六字节边界上对齐的一字节char(定义为一个字节,见下文)呢 这会影响上面的工会吗 有两件事需要注意 我在这里具体谈论的是标准允许什么,而不

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

union {
  int i;
  char c[sizeof(int)];
};
现在这似乎是个好主意,但我想知道该标准是否允许
char
的对齐要求比
int
的对齐要求更严格的情况

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

这会影响上面的工会吗

有两件事需要注意

  • 我在这里具体谈论的是标准允许什么,而不是一个理智的实现者/架构将提供什么

  • 我使用的术语是ISO C意义上的“字节”,它是字符的宽度,不一定是8位


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

    如果不明显:

    • sizeof(T[N])
      sizeof(T)*N
    • sizeof
      char
      为单位;所有类型都表示为固定数量的字节(
      char
      ),该数字就是它们的大小。详见6.2.6(类型表示)
    • 给定
      ta[2]
      (char*)&A[1]-(char*)&A[0]
      等于A[0]的大小
    • 因此,
      T
      的对齐要求不大于
      sizeof(T)
      (实际上它将
      sizeof(T)
    看一看。在那里,我质疑C联合的有用性,并且有一些有趣的见解。重要的是,该标准根本不能确保不同字段的对齐


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

    你需要引用ISO来说服我,R。如果你自动缩放
    a[i],阵列的哪些特定功能将不起作用
    a+i
    使用对齐而不是大小?@paxdiablo:那么这就行不通了
    (void*)a+i*sizeof(*a)
    @sharth-无论如何都不行-不允许在
    void*
    上使用指针算术。@paxdiablo:Read 6.2.6类型表示法。所有类型都以
    char
    为单位表示。数组的大小是元素数乘以元素类型的大小。等等等等等等。这些都是非常基本的。@pax数组不能有填充,必须按照标准连续。因此R所说的完全正确