结构体可以使用运算符sizeof进行计算其所占的字节空间。
数据对齐是指在处理结构体中的成员时,成员在内存中的起始地址编码必须是成员类型所占字节数的整数倍。
结构体成员采用数据对齐主要是为了加快读取数据的速度,减少指令周期,使程序运行的更快。
规则:结构体sizeof的计算结果必须是结构体中占用空间最多的成员所占空间的整数倍。
如果结构体中的成员包括数组或者其他结构体,在数据对齐时,要以结构体中最深层的基本数据类型为准。
struct s1{
int a;
};
struct s2{
char a[4];
};
struct s3{
char a[4];
char b;
};
struct s4{
s1 a;
char b;
};
struct s5{
s2 a;
char b;
};
结果:
sizeof(struct s1) = 4;
sizeof(struct s2) = 4;
sizeof(struct s3) = 5;
sizeof(struct s4) = 8;
sizeof(struct s5) = 5;
以任意字节进行字节对齐
使用伪指令:#pragma pack(n) C编译器将按照n个字节对齐。
使用伪指令:#pragma pack(),取消自定义对齐方式
#pragma pack(1)
struct test{
char c;
short s1;
short s2;
int i;
};
上述代码中将对齐方式设为1,因此sizeof(test) = 1+2+2+4=9;
struct test{
char c;
short s1;
short s2;
int i;
};
如果取消对齐方式,则编译器默认对齐方式为8,sizeof(test) = 1+1(补齐)+2+2+2(补齐)+4=12.
字节对齐的作用不仅是便于CPU的访问,同时合理的利用字节对齐可以有效地节省存储空间