C++内存对齐
有内存对齐的好处:
内存中成员变量的存放更加有序,简化数据存取的步骤,提高运行效率。
内存对齐的规则:
(1) 结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 offset 都是该成员大小与有效对齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节。
(2) 结构体的总大小为 有效对齐值 的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
struct s1{
char j;
int i;
char ch;
};
struct s2{
char j;
char ch;
int i;
};
struct s3{
int i;
char j;
char ch;
};
int main(){
cout<< sizeof(struct s1)<<endl;
cout<< sizeof(struct s2)<<endl;
cout<< sizeof(struct s3)<<endl;
return 0;
}
输出的结果为:
pragma pack(n)
设定结构体、联合以及类成员变量以 n 字节方式对齐
pragma pack(n) 使用
#pragma pack(push) // 保存对齐状态
#pragma pack(4) // 设定为 4 字节对齐
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop) // 恢复对齐状态
参考文章:内存对齐详解