Ruf*_*ind 13 c c++ language-lawyer
alignof(char)
除了1之外什么都可以吗?
最弱(最小)的对准是种类的排列
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定义类似):
对齐是实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数.
从这一点来看,我不认为对齐是有意义的,char
但1
由于要求sizeof(char) ? 1
,这意味着相邻char
元素之间的距离只能是1
字节.
这有意义吗?
是的.虽然这个陈述没有在标准中明确规定,但我认为它可以从它们推断:
N1570 6.5.3.4 sizeof和_Alignof运算符
4当
sizeof
应用于具有type char
,,unsigned char
或signed char
(或其合格版本)的操作数时,结果为1
.当应用于具有数组类型的操作数时,结果是数组中的总字节数.
以char
为例.说我们有一个char charArr[2];
.sizeof charArr
保证是2
,和sizeof charArr[0]
= sizeof charArr[1]
= 1
.这意味着两个相邻的char
对象取代了2个字节.
因此,可以推断出"至少可以分配char的连续地址之间的字节数" 1
.此外,char
大多数的对齐是一个正整数,所以它不能是除了之外的任何数字1
.