sizeof(char)始终为1,在我看来,类型的对齐要求永远不会大于其大小。引用即将推出的C ++ 11标准(3.11):
aligment是一个实现定义的整数值表示 连续地址之间可以分配给定对象的字节数。
因此,如果类型的对齐大于其大小,则无法在连续元素之间创建没有空白空间的数组。
这种解释是否正确,因此始终是alignof(char)== 1?
答案 0 :(得分:1)
你是对的。
您可以从C ++数组的“compact”(无填充)布局推断任何对象类型,以便可以定义此类型的数组必须具有对齐,该对齐是其的除数大小
特别是,这种尺寸1的对齐必须是1.
特别是,char
,signed char
和unsigned char
的对齐方式为1.
OTOH,你无法推断出抽象类与这个参数的对齐情况。
答案 1 :(得分:0)
我查看了C ++ 11定义指针算法的方式,并没有看到任何会阻止类型对齐的大小超过其大小的方法。编译器负责确保数组中的每个元素都正确对齐(通过插入适量的填充)并确保指针算法正常工作。基本上,指针算术没有参考sizeof(* ptr)来定义,即使人们通常会像它一样谈论它。
n3290§5.7p5:
当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向偏离原始元素的元素,使得结果元素和原始数组元素的下标的差异等于整数表达式。
编辑:
但是,sizeof
运算符是根据数组中连续元素之间的偏移量定义的,因此alignof(X)
不能大于sizeof(X)
,因为这意味着数组X包含无效对齐的对象。同时,sizeof(X)
不一定代表对象的实际大小。例如。另一种类型的X成员或基础子对象可以使用少于sizeof(X)
个字节来存储,但我不知道实际使用它的任何实现。