最近我看到了下面的代码片段,它试图确保 i
的所有字节(nad no more)都可以作为 c
的单个元素访问:
union {
int i;
char c[sizeof(int)];
};
现在这似乎是个好主意,但我想知道标准是否允许 char
的对齐要求比 int
的对齐要求更严格。
换句话说,是否有可能有一个四字节的 int 需要在四字节边界上与一个字节的 char
对齐(根据定义,它是一个字节,见下文)是否需要在十六字节边界上对齐?
这会影响上面 union 的使用吗?
有两点需要注意。
我在这里具体谈论的是标准允许的内容,而不是理智的实现者/架构会提供的内容。
我在 ISO C 意义上使用术语“字节”,它是
char
的宽度,不一定是 8 位。
最佳答案
没有类型的对齐要求比它的大小更严格(因为数组的工作方式),sizeof(char)
为 1。
如果不是很明显:
sizeof(T [N])
是sizeof(T)*N
。sizeof
以char
为单位;所有类型都表示为固定数量的字节 (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/