是的,我读过这个:
http://msdn.microsoft.com/en-us/library/83ythb65.aspx
但我不清楚.首先,__ declspec(align(#))使得用它声明的每个对象(在结构中)都以对齐的偏移量开始.那部分很清楚.该对象也是由对象所在的结构化“继承”的.但它不会改变对象的大小,是吗?确切地说,为什么sizeof()在这段代码中:
但我不清楚.首先,__ declspec(align(#))使得用它声明的每个对象(在结构中)都以对齐的偏移量开始.那部分很清楚.该对象也是由对象所在的结构化“继承”的.但它不会改变对象的大小,是吗?确切地说,为什么sizeof()在这段代码中:
__declspec(align(32)) struct aType {int a; int b;}; sizeof(aType);
回来32?
解决方法
对象的大小用于计算数组中的偏移量,当您使用指针时,sizeof(x)必须始终是对齐值的倍数.在这种情况下,1 x 32.但如果你有__declspec(align(32))struct aType {int a [12];然后大小将是2 x 32 = 64,因为sizeof(a)是12 x 4 = 48.如果我们改变它以对齐到4,8或16,它将是48.
它实际工作的方式是编译器在结构的命名成员之后添加一个未命名的填充成员,以将结构填充到它的对齐大小.
如果它不能以这种方式工作,例如:
aType *aPtr = new aType[15]; aPtr[12].a = 42;
不会正常工作,因为编译器会将12乘以sizeof(aPtr)以在内部添加到aPtr.