alignof(char)
可以是1吗?
来自unofficial cppreference.com wiki:
最弱(最小)的对齐方式是
char
,signed char
和unsigned char
类型的对齐方式,通常为1。
"通常"似乎暗示它可能是别的东西。
C标准关于char
对齐的唯一规定是(C11 N1570 6.2.8第1段):
可以使用
_Alignof
表达式查询完整类型的对齐要求。类型char
,signed char
和unsigned char
应具有最弱的对齐要求。
但是,考虑对齐的定义(C11 N1570 6.2.8第1段,并为C ++ 11定义类似):
alignment是一个实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。
由于char
的要求1
,我认为将sizeof(char) ≡ 1
与char
对齐是不合理的。相邻的1
元素只能是{{1}}个字节。
这有意义吗?
答案 0 :(得分:7)
是即可。虽然这个陈述没有在标准中明确规定,但我认为可以从它们推断:
N1570 6.5.3.4 The sizeof and _Alignof operators
4当
sizeof
应用于具有type char
的操作数时,unsigned char
或signed char
,(或其合格版本) 结果是1
。当应用于具有数组类型的操作数时, result是数组中的总字节数。
以char
为例。假设我们有char charArr[2];
。 sizeof charArr
保证为2
,sizeof charArr[0]
= sizeof charArr[1]
= 1
。这意味着两个相邻的char
个对象取代了2个字节。
因此,可以推断“可以分配char的连续地址之间的字节数”至少为1
。此外,char
的对齐最多为正整数,因此除了1
之外,它不能是任何数字。
答案 1 :(得分:1)
我不是语言律师,但如果我们看一下C的第6.5.3.4节第3段:
当应用于具有char,unsigned char或signed char类型的操作数时, (或其合格版本)结果为1.
对我来说,似乎并不要求char
的大小必须为1,只是操作数sizeof
的结果必须返回1.对齐也不是一回事大小。对齐由ABI决定,而不是C或C ++标准。当然,char
的对齐确实在x86,x86_64等上是1,但这并不是一个很难的要求。