c - 如果 char 的对齐要求比 int 更严格,这个 union 会起作用吗?

标签 c alignment iso unions

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

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

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

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

这会影响上面 union 的使用吗?

有两点需要注意。

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

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

最佳答案

没有类型的对齐要求比它的大小更严格(因为数组的工作方式),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))<

关于c - 如果 char 的对齐要求比 int 更严格,这个 union 会起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4496514/

相关文章:

python - 在 python C API 中创建模块时如何包含 __build_class__

c - 以特殊的十六进制格式显示整数

c - 如何在打开/写入功能中实现超时

html - 如何使用 bootstrap 3.0 右对齐元素?

html - CSS 网页宽度、导航栏居中和小部件环绕居中

c - 为什么来自 C 标准工作组的文档受密码保护?

c - 强制刷新或读取未刷新的输出

html - 如何并排创建 3 个大小相同的盒子?

c - 将IP封装成uint32

c - 带符号类型的移位运算符