C(和C ++)中char的对齐是否保证为1?

时间:2016-04-23 01:19:31

标签: c++ c language-lawyer

alignof(char)可以是1吗?

来自unofficial cppreference.com wiki

  

最弱(最小)的对齐方式是charsigned charunsigned char类型的对齐方式,通常为1。

"通常"似乎暗示它可能是别的东西。

C标准关于char对齐的唯一规定是(C11 N1570 6.2.8第1段):

  

可以使用_Alignof表达式查询完整类型的对齐要求。类型charsigned charunsigned char应具有最弱的对齐要求。

但是,考虑对齐的定义(C11 N1570 6.2.8第1段,并为C ++ 11定义类似):

  

alignment是一个实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。

由于char的要求1,我认为将sizeof(char) ≡ 1char对齐是不合理的。相邻的1元素只能是{{1}}个字节。

这有意义吗?

2 个答案:

答案 0 :(得分:7)

即可。虽然这个陈述没有在标准中明确规定,但我认为可以从它们推断:

N1570 6.5.3.4 The sizeof and _Alignof operators

  

4当sizeof应用于具有type char的操作数时,   unsigned charsigned char,(或其合格版本)   结果是1。当应用于具有数组类型的操作数时,   result是数组中的总字节数。

char为例。假设我们有char charArr[2];sizeof charArr保证为2sizeof 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,但这并不是一个很难的要求。