最近我遇到了以下代码段,这是为了确保i
的所有字节(不再是nad)可以作为c
的单个元素访问:
union {
int i;
char c[sizeof(int)];
};
现在这似乎是一个好主意,但我想知道标准是否允许char
的对齐要求比int
的对齐要求更具限制性。
换句话说,是否可能有一个四字节的int,需要在一个四字节的边界上与一个字节char
对齐(根据定义,它是一个字节,见下文)需要在16字节边界上对齐吗?
这会不会影响上面联盟的使用?
有两点需要注意。
我在具体谈论标准允许的内容,而不是一个理智的实现者/架构会提供什么。
我在ISO C意义上使用术语“字节”,它是char
的宽度,不一定是8位。
答案 0 :(得分:7)
任何类型都不能具有比其大小更严格的对齐要求(因为数组的工作原理),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)
)答案 1 :(得分:1)
看看this thread。在那里,我质疑C联盟的用处,并且有一些有趣的见解。重要的是标准不能确保不同字段的对齐!
编辑:paxdiablo,刚刚注意到你是回答这个问题的人之一,所以你应该熟悉这个限制。