为什么要对齐
主要是为了性能原因,在对其的地址块上访问数据块会提高性能
对其的原则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小与系统默认的对其数之中的较小者的整数倍,如有需要编译器会在最末一个成员之后加上填充字节
通过实例来说明:
#include <iostream>
using namespace std;
struct s1
{
char a;
int b;
};
struct s2
{
char c;
s1 s;
int d;
};
#pragma pack(4)
struct s3
{
char a;
double b;
};
#pragma pack()
int main()
{
cout<<sizeof(s1)<<endl; //8,window下系统默认的对齐大小为8,Linux默认对齐大小为4
cout<<sizeof(s2)<<endl; //16,在s2中s1的成员是被打撒来看的,最宽数据成员大小为4,但是s1是作为一个整体出现的,所以c和a不能放到一起
cout<<sizeof(s3)<<endl; //12,系统默认对齐大小可以通过pragma pack()进行修改,windows下取值只能为1,2,4,8,16。Linux下取值只能为1,2,4
return 0;
}