是的,我已阅读以下内容:http : //msdn.microsoft.com/zh-cn/library/83ythb65.aspx但是我不清楚。首先,__declspec(align(#))
使用它声明的每个对象(在结构中)都从对齐的偏移量开始。那部分很清楚。该对象也由对象所在的结构化“继承”。但是它不会改变对象的大小,对吗?确切地说,为什么sizeof()
在此代码中执行以下操作:
__declspec(align(32)) struct aType {int a; int b;};
sizeof(aType);
回报32
?
对象的大小用于计算数组中的偏移量以及使用指针时的偏移量,因此sizeof(x)
必须始终为对齐值的倍数。在这种情况下,为1 x32。但是,如果您有__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
内部。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句