内存对其的解释:
对齐规则是按照成员的声明顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍。
为什么要内存对齐?原因有以下几点:
1、CPU对内存的读取不是连续的,而是分成块读取的,块的大小只能是1、2、4、8、16…字节;
参考:https://blog.csdn.net/mtv_zmx/article/details/8995456
2、当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣;
参考:https://blog.csdn.net/chen895281773/article/details/9567337
3、某些硬件平台只能从规定的相对地址处读取特定类型的数据,否则会产生异常。
数据成员对齐规则:
结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset(偏移)为0的地方,以后每个数据成
员的对齐按照 #pragma pack 指定的数值和这个数据成员自身长度中,比较小的那个进行
结构(或联合)的整体对齐规则:
在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照 #pragma pack 指定的数
值和结构(或联合)最大数据成员长度中,比较小的那个进行。
结构体作为成员:
如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。
#pragma pack(n) 对齐系数
Linux 32 默认 #pragma pack(4)
Linux 64 默认 #pragma pack(8)
#include <iostream>
/*#pragma pack(4)*/
using std::cout;
using std::endl;
struct x
{
char a;
int b;
short c;
char d;
}MyStructX;//12
struct y
{
int b;
char a;
char d;
short c;
}MyStructY;//8
struct SS
{
int a;
char b;
short c;
int d;
struct FF
{
int a1;
char b1;
short c1;
char d1;
}MyStructFF; //24
#if 1
/* char e;//28 */
int e; //32
double ww;//40
#endif
}MyStructSS;
struct DD
{
int a;
char b;
short c;
int d;
struct FF
{
double a1;
char b1;
short c1;
char d1;
}MyStructFF;
char e;
}MyStructDD;//40
struct GG
{
char e[2];
short h;
struct A //8
{
int a;
double b; //16
float c; //24
}MyStructA;
}MyStructGG;//32
int main(int argc, char **argv)
{
cout <<"sizeof(MyStructX) = " << sizeof(MyStructX) << endl;
cout <<"sizeof(MyStructY) = " << sizeof(MyStructY) << endl;
cout <<"sizeof(MyStructSS) = " << sizeof(MyStructSS) << endl;
cout <<"sizeof(MyStructDD) = " << sizeof(MyStructDD) << endl;
cout <<"sizeof(MyStructGG) = " << sizeof(MyStructGG) << endl;
return 0;
}
程序运行结果如下图所示:
sizeof(MyStructX) = 12
sizeof(MyStructY) = 8
sizeof(MyStructSS) = 40
sizeof(MyStructDD) = 40
sizeof(MyStructGG) = 32