c – `__declspec(align(#))`如何工作?

是的,我读过这个: http://msdn.microsoft.com/en-us/library/83ythb65.aspx
但我不清楚.首先,__ 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.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...