内存对齐的规则:
结果为
1、 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。
2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
结构体中含有结构体的情况:
#pragma pack(8)
struct A
{
short a;
int b;
char c;
// double d;
};
struct B
{
char c;
struct A d;
int e;
};
int main(int argc, char* argv[])
{
B obj;
cout<<(long)&(obj.d.a) - (long)&obj<<endl;
cout<<(long)&(obj.d.b) - (long)&obj<<endl;
cout<<(long)&(obj.d.c) - (long)&obj<<endl;
// cout<<(long)&(obj.d.d) - (long)&obj<<endl;
cout<<(long)&(obj.e) - (long)&obj<<endl;
return 0;
}
结果为
4
8
12
16
Press any key to continue
#pragma pack(8)
struct A
{
short a;
int b;
char c;
double d;
};
struct B
{
char c;
struct A d;
int e;
};
int main(int argc, char* argv[])
{
B obj;
cout<<(long)&(obj.d.a) - (long)&obj<<endl;
cout<<(long)&(obj.d.b) - (long)&obj<<endl;
cout<<(long)&(obj.d.c) - (long)&obj<<endl;
cout<<(long)&(obj.d.d) - (long)&obj<<endl;
cout<<(long)&(obj.e) - (long)&obj<<endl;
return 0;
}
结果为
8
12
16
24
32
Press any key to continue
几年后重新查看自己的博客,发觉太过于理论化了。
其实只要有个概念就好了,实际编码中都是要写测试代码,查看内存情况的。