关于结构体内存对齐 - 自然对界
理论知识以及实验验证理解
自然对界:既结构体内存对齐时各成员变量所占内存对齐时的边界。
结构体内存对齐:结构体各成员变量默认会向占内存最大成员变量靠齐。
如果结构体中包含其它结构体变量时,默认边界对齐时,寻找最大成员变量的范围会包含该结构体中的成员变量。
栗子如下:
struct A {
char variableA;
long variableB;
char variableC;
};
struct B {
char variable1;
struct A structA;
short variable2;
};
以上A、B结构体中,结构体A的默认对界以sizeof(long)为准,既sizeof(structA) = 12。结构体B的默认对界同样也将以sizeof(long)为准,既sizeof(structB) = 12 + 4 + 4。
以下伪指令可用于手动指定结构体变量对齐时向n字节靠齐:
#pragma pack(n):以下范围内结构体,编译器将按照n字节对齐
#pragma pack():以上,至此结束,取消自定义
如果n大于结构体中最大成员的size时,则结构体仍将按照size最大的成员进行边界对齐。如果当最大成员size大于n时,则其余小于n的成员都将按照n对齐边界,大于n的仍将按照其自身size对齐。
栗子如下:
#pragma pack(4)//指定自然对界的对齐方式
struct A {
char variableA;
long long variableB;
char variableC;
};
struct B {
char variable1;
struct A structA;
short variable2;
};
#pragma pack()//取消自然对界的对齐
以上A、B结构体中,结构体A默认对界以n = 4为准,但超出n的成员变量variableB仍将以其自身size为准,既sizeof(structA) = 8 + 4 + 4。结构体B中的默认对界同样也以4为准,既sizeof(structB) = 16 + 4 + 4。