alignof(char)== 1?

时间:2011-08-25 13:56:57

标签: c++11

sizeof(char)始终为1,在我看来,类型的对齐要求永远不会大于其大小。引用即将推出的C ++ 11标准(3.11):

  

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

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

这种解释是否正确,因此始终是alignof(char)== 1?

2 个答案:

答案 0 :(得分:1)

你是对的。

您可以从C ++数组的“compact”(无填充)布局推断任何对象类型,以便可以定义此类型的数组必须具有对齐,该对齐是其的除数大小

特别是,这种尺寸1的对齐必须是1.

特别是,charsigned charunsigned char的对齐方式为1.

OTOH,你无法推断出抽象类与这个参数的对齐情况。

答案 1 :(得分:0)

我查看了C ++ 11定义指针算法的方式,并没有看到任何会阻止类型对齐的大小超过其大小的方法。编译器负责确保数组中的每个元素都正确对齐(通过插入适量的填充)并确保指针算法正常工作。基本上,指针算术没有参考sizeof(* ptr)来定义,即使人们通常会像它一样谈论它。

  

n3290§5.7p5:

     

当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向偏离原始元素的元素,使得结果元素和原始数组元素的下标的差异等于整数表达式。

编辑:

但是,sizeof运算符是根据数组中连续元素之间的偏移量定义的,因此alignof(X)不能大于sizeof(X),因为这意味着数组X包含无效对齐的对象。同时,sizeof(X)不一定代表对象的实际大小。例如。另一种类型的X成员或基础子对象可以使用少于sizeof(X)个字节来存储,但我不知道实际使用它的任何实现。