char的对齐方式是1吗?

8

sizeof(char)始终为1,我认为类型的对齐需求不能大于其大小。摘自即将发布的C++11标准(3.11):

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

因此,如果类型的对齐要求大于其大小,则无法创建没有连续元素之间的空白空间的数组。

这种解释是否正确,即alignof(char)始终等于1?


是的,没错。您还需要什么? - CommonSense
据我回忆,sizeof(char)==1 是根据定义的。 - Raymond Chen
您还可以考虑CHAR_BIT的值,这可能有助于char获得正确的对齐方式。 - Bo Persson
@Raymond:OP 的问题是关于 alignof,而不是 sizeof - Sebastian Mach
@Raymond:不用道歉,我一直都在误读 ;) - Sebastian Mach
显示剩余7条评论
2个回答

1

你是正确的。

从 C++ 数组的“紧凑”(无填充)布局可以推断出,任何对象类型都必须具有其大小的除数对齐方式,才能定义该类型的数组。

特别地,这种大小的类型的对齐方式必须为 1。

特别地,charsigned charunsigned char 的对齐方式为 1。

然而,通过这个论点,你不能推断出抽象类的对齐方式。


0
我查看了C++11定义指针算术的方式,没有看到任何阻止类型对齐大于其大小的情况。编译器应该负责确保数组中的每个元素都被正确对齐(通过插入正确数量的填充),并确保指针算术正常工作。基本上,尽管人们通常将其视为是,但指针算术并未与sizeof(*ptr)相关定义。
引用: n3290§5.7 p5:
当将具有整数类型的表达式添加到指针或从指针中减去时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向原始元素的偏移量为差异的一个元素,使得结果和原始数组元素的下标之差等于整数表达式。
编辑:
然而,sizeof 运算符是根据数组中相邻元素之间的偏移量定义的,因此 alignof(X) 不能大于 sizeof(X),因为这意味着 X 的数组包含无效对齐的对象。同时,sizeof(X) 不一定表示对象的实际大小。例如,另一种类型的 X 成员或基础子对象可能使用少于 sizeof(X) 字节来存储,尽管我不知道任何实际使用的实现。

如果 C++11 确实放弃了这样的要求,那只能说明标准编辑出了问题。这并不是第一次出现这种情况。 - curiousguy
N3242是另一个来源。8.3.4 数组 [dcl.array] "数组类型的对象包含一组连续分配的非空的T类型的N个子对象。" 这很难找到。(不,不是。) - curiousguy
好的,这是一个更好的来源。此外,5.3.3/2说:“当应用于类时,结果是该类对象中的字节数,包括放置该类型对象所需的任何填充。” 这可能意味着sizeof返回对象在任何数组中时的“大小”,即使在其他上下文中该对象的大小可能不同。 - bames53
除了将填充包含或不包含在表示中视为表示变化之外,实际上并没有什么变化。任何子对象无论对象是否在数组中都将保持相同的位置,因此从这个意义上说,表示根本没有改变。唯一的变化是,在数组之外,编译器可能分配少于“sizeof”字节来保存对象。 - bames53
1
事实上,仔细想想你引用的数组定义并不意味着对象之间不能有填充。 “连续分配”只是表示分配的空间是连续的,而不表示数组子对象与彼此连续。但是,“sizeof”的定义非常明确,它计算填充。 - bames53
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接