一、理论部分
1.结构体第一个的偏移量为0,之后的每一个偏移量要从自身的整数倍开始
2.如果结构体没有设定对齐字节数,则最大成员为对齐字节数,如有设置,则最大字节数为
min(最大成员,设定的对齐字节)
二、实验
注意,结构体里面的变量顺序,会影响占用空间
struct A{
char c; // 1
};
int main(){
cout<<sizeof(A)<<endl; // 输出1
return 0;
}
struct A{
char c; // 1
short st; // 2
};
int main(){
cout<<sizeof(A)<<endl; // 4
return 0;
}
这里为4的原因是内存对齐(2+2)
struct A{
char c; // 1
short st; // 2
int i; // 4
};
int main(){
cout<<sizeof(A)<<endl; // 8
return 0;
}
这里为8的原因是之前的内存为4不变,这里又加入了4个字节,4+4=8,注意这里不能按全部变为4个字节,总共12字节理解。可以按从上往下顺序执行理解
struct A{
int i; // 4
char c; // 1
short st; // 2
};
int main(){
cout<<sizeof(A)<<endl; // 8
return 0;
}
这里换了顺序还是不影响,也为8,可以理解为前面占了4个格子,后面第二排占一个格子,还有3个格子,取两个格子可以给short ,总共8字节(8个格子)
struct A{
char c; // 1
short st; // 2
int i; // 4
char c2; //1
};
int main(){
cout<<sizeof(A)<<endl; // 12
return 0;
}
这里前面三排占了8个格子,后面只能取4个格子,占一个格子,8+4
struct A{
char c2 ;//1
char c; // 1
short st; // 2
int i; // 4
};
int main(){
cout<<sizeof(A)<<endl; // 8
return 0;
}
这里换了位置,为什么不一样了呢?
是因为从前往后看,1+1+2=4 刚好和int对齐,所以只用8个字节。但是这里在加一个char也会为12,如下:
struct A{
char c2 ;//1
char c3 ;//1
char c; // 1
short st; // 2
int i; // 4
};
int main(){
cout<<sizeof(A)<<endl; // 12
return 0;
}
struct A{
char c; // 1
short st; // 2
int i; // 4
long l; // 8
};
int main(){
cout<<sizeof(A)<<endl; // 16
return 0;
}