是,我 读取此内容:http://msdn.microsoft.com/en-us/library/83ythb65.aspx
但我不清楚。首先,__declspec(align(#))
使用它声明的每个对象(在结构中)都以对齐的偏移量开始。那部分很清楚。该对象也是由对象所在的结构化“继承”的。但它不会改变对象的大小,是吗?确切地说,为什么sizeof()
在此代码中:
__declspec(align(32)) struct aType {int a; int b;};
sizeof(aType);
返回32
?
答案 0 :(得分:12)
对象的大小用于计算数组中的偏移量以及使用指针时,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.
它实际工作的方式是编译器在结构的命名成员之后添加一个unamed padding成员,以将结构填充到它的对齐大小。
如果它不能以这种方式工作,例如:
aType *aPtr = new aType[15];
aPtr[12].a = 42;
无法正常工作,因为编译器会将12
乘以sizeof(aPtr)
以在内部添加到aPtr
。
答案 1 :(得分:3)
文档写得不好,或者我对英语作为外语的命令不符合标准。
// make a nice 16 align macro
#ifndef ALIGN16
#define ALIGN16 __declspec(align(16))
#endif
// align the structure
struct ALIGN16 CB {
ALIGN16 bool m1; // and
ALIGN16 int m2; // align
ALIGN16 int m3; // each
ALIGN16 short m4; // element
};
// now it performs as expected
printf("sizeof(CB) %d\r\n", sizeof(CB));
CB vCb;
printf("CB: %p, %%%d\r\n", &vCb, (UINT_PTR)&vCb % 16);
printf("CB.m1: %p, %%%d\r\n", &vCb.m1, (UINT_PTR)&vCb.m1 % 16);
printf("CB.m2: %p, %%%d\r\n", &vCb.m2, (UINT_PTR)&vCb.m2 % 16);
printf("CB.m3: %p, %%%d\r\n", &vCb.m3, (UINT_PTR)&vCb.m3 % 16);
printf("CB.m4: %p, %%%d\r\n", &vCb.m4, (UINT_PTR)&vCb.m4 % 16);
__declspec(align(#))
仅影响结构和sizeof()
的对齐方式,而不影响其中的每个成员。如果希望对齐每个属性,则需要在成员级别指定对齐方式。
我最初还假设struct-level __declspec(align())
影响了它及其成员但却没有。因此,如果您希望每个成员对齐,则需要具体。