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

Ruf*_*ind 13 c c++ language-lawyer

alignof(char)除了1之外什么都可以吗?

来自非官方的cppreference.com维基:

最弱(最小)的对准是种类的排列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定义类似):

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

从这一点来看,我不认为对齐是有意义的,char1由于要求sizeof(char) ? 1,这意味着相邻char元素之间的距离只能是1字节.

这有意义吗?

nal*_*zok 7

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

N1570 6.5.3.4 sizeof和_Alignof运算符

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

char为例.说我们有一个char charArr[2];.sizeof charArr保证是2,和sizeof charArr[0]= sizeof charArr[1]= 1.这意味着两个相邻的char对象取代了2个字节.

因此,可以推断出"至少可以分配char的连续地址之间的字节数" 1.此外,char大多数的对齐是一个正整数,所以它不能是除了之外的任何数字1.