1 结论 与 验证
1,结构体定义的时候,变量成员的顺序会影响结构体的大小;
2,对齐:成员变量以什么样的方式,排列;紧密排列、还是松散中间是不是有间隔;
3,编译器对于对齐方式,可以选择的。vs默认是8字节对齐的。
4、int类型:4字节,如果编译设置的对齐方式,大于4字节,那么就必须以字节的倍数分配地址,对齐方式>=4字节的时候,如果结构体里面,有int,那么结构体的大小,就是4的整数倍。
5、如果short、double,同样的道理;
6、如果有相同类型的变量呢,一定要放在一起,会减小结构体的空间;
7、结构体定义,变量类型从小到大的顺序比较合适;
(从小到大==从大到小,都是最节省空间);大小混着放,占用空间很大;
8、定义结构体,主要是人更容易理解的方式定义。
size = 8
size = 12
size = 16
size = 12
size = 16
size = 24
struct s1 {//8
char c1;
char c2;
int a;
};
struct s2 {//12
char c1;
int a;
char c2;
};
struct s3{//16
char arr[5];
int a;
short b;
};
struct s4 {//12
char arr[5];
short b;
int a;
};
struct s5 {//16
char a;
char b;
double c;
};
struct s6 {//24
char a;
double c;
char b;
};
struct s7 {//16
double a;
char c;
char b;
};
struct s8 {//24
char a;
short b;
int c;
float d;//4
double e;
};
struct s9 {//32
char a;
double e;
short b;
int c;
float d;
};
struct s10 {//24
double e;
float d;
int c;
short b;
char a;
};
void test1() {
cout << sizeof(struct s1) << " " << sizeof(struct s2) << endl;
cout << sizeof(struct s3) << " " << sizeof(struct s4) << endl;
cout << sizeof(struct s5) << " " << sizeof(struct s6) << " " << sizeof(struct s7) << endl;
cout << sizeof(struct s8) << " " << sizeof(struct s9) << " " << sizeof(struct s10)<<endl;
}
(从小到大==从大到小,都是最节省空间);大小混着放,占用空间很大;
2 设置对其字节数
编译器对于对齐方式,可以选择的。vs默认是8字节对齐的。
可以程序设置对其字节数
pragma /pˈræɡ mə/ n.编译指示;杂注
#pragma pack(1) //设置字节对齐数为1字节,此时与大小顺序无关,紧密排列
//4字节对齐
#pragma pack(4)
//8字节对齐
#pragma pack(8)
3 什么时候修改对齐设置
·嵌入式环境
·VR
·特定系统环境
等这些内存比较小的场合,否则不要随意修改,否则在不同系统运行效果会不一样。
4 结构体嵌套
//结构体B嵌套结构体A,结构体A存储起点为A内部最大成员整数倍的地方。
//(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。)
//结构体嵌套
//结构体B嵌套结构体A,结构体A存储起点为A内部最大成员整数倍的地方。
//(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。)
struct s11 {//8
char c1;
char c2;
int a;
};
struct s12 {//24
char c1;//4
s11 d; //从第4开始,d内部最大成员int,d的起点以4的倍数开始,所以前面4字节全部给char c1;
int a;
double c2;
};
struct s13 {//24
char c1;
double c2;
int a;
};
struct s14 {//48
char c1;//8
s13 d;//从第8开始,d内部最大成员double,d的起点以8的倍数开始,所以前面8字节全部给char c1;
int a;
double c2;
};
struct s15 {//8
char c1;
char c2;
int a;
};
struct s16 {//16
char c1;
int a;
s15 d; //从第8开始
};
void test2() {
cout << sizeof(struct s11) << " " << sizeof(struct s12) << endl;
cout << sizeof(struct s13) << " " << sizeof(struct s14) << endl;
cout << sizeof(struct s15) << " " << sizeof(struct s16) << endl;
}