先看一下代码运行结果:
//理论上占5字节
struct {
int x;
char y;
}Test;
//理论上占6字节
struct {
int i;
char c1;
char c2;
}Test1;
//理论上占6字节
struct {
char c1;
int i;
char c2;
}Test2;
//理论上占6字节
struct {
char c1;
char c2;
int i;
}Test3;
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
printf("%d\n", sizeof(Test));
printf("%d\n", sizeof(Test1));
printf("%d\n", sizeof(Test2));
printf("%d\n", sizeof(Test3));
return a.exec();
}
输出结果:
是不是和预想的不一致。
这里就涉及到的内存的对齐。
结构体的首个变量放在其实位置,其余的变量依次放到后面,内存会按照自己的大小划分,元素放置的位置 一定在自己整数倍上开始,这就是内存对齐
对齐规则:
结构(struct)(或联合(union))的数据成员,第一个数据成员放在偏移位置为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行放置,默认#pragma pack(4),也就是四个字节对齐。
可以使用#pragma pack来改变对齐字节数。
如果我们按照一个字节来对齐的话,结果就是我们预想的那样了。
//1字节对齐
#pragma pack(1)
struct {
int x;
char y;
}Test;
struct {
int i;
char c1;
char c2;
}Test1;
struct {
char c1;
int i;
char c2;
}Test2;
struct {
char c1;
char c2;
int i;
}Test3;
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
printf("%d\n", sizeof(Test));
printf("%d\n", sizeof(Test1));
printf("%d\n", sizeof(Test2));
printf("%d\n", sizeof(Test3));
return a.exec();
}
运行结果:
aaa