我正在尝试使用来对齐数据成员#pragma pack (n) http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.100%29.aspx。以下面为例:
#include <iostream>
using namespace std;
#pragma pack(8) // or (16)
struct A
{
int a;
char b;
char c;
char d;
char e;
char f;
double g;
};
int main()
{
cout << sizeof(A) << endl;
return 0;
}
两者都会打印24
for #pragma pack(8)
and #pragma pack(16)
。我可以理解结果n=8
根据我的理解,数据对齐如下:
Bytes: |1 2 3 4|5|6|7|8|9|10 11 12 13 14 15 16|17 18 19 20 21 22 23 24|
Data: |a |b|c|d|e|f|padding |g |
但我不明白为什么结果仍然是24
for n=16
。我还尝试了其他示例,所有这些示例似乎都给出了相同的结果n=8
and n=16
。有人可以解释为什么吗?数据成员的对齐方式是否与n=8
?
P.S.:在 Win-x64 下的 VS2010 中测试。
从您链接到的页面:
成员的对齐将位于边界上,该边界是
n 的倍数或成员大小的倍数,以
较小。
对于每个成员,它采用成员的最佳对齐和包值之间的最小对齐。您的示例中的成员对齐完全相同,无论pack(8)
and pack(16)
因为类型的最佳对齐方式都小于 16。
如果您有一个需要 16 字节对齐的成员,例如__m128
,您将能够找到不同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)