普通节省空间的方法
struct A{
char name;
int age;
short sex;
};
int main()
{
printf("%d\n", sizeof(struct A));
return 0;
}
打印结果:
12
字节对齐
1.按最大类型字节数分配空间,比如A中最大为int类型,所以按4字节对齐。
2.先给name分配4个字节的空间,name占一个字节剩余3字节
3.age为int类型占4个字节,上述剩余3个字节不够存放,所以再分配4个字节的空间,给age,占4剩0
4.sex为short类型占2字节,上述剩余0字节不够存放,所以再分配4个字节的空间,给sex,占2剩2
5.总共分配了12个字节,所以sizeof(struct A)==12
注意:32位系统下最大分配4字节。若有double类型,按4字节分配两次,最终还是4字节对齐。64位系统有double则按照8字节分配。
普通策略节省空间
可以看到上述结构体 A 占12字节,若改为以下写法,可优化至8字节。
struct A{
int age;
short sex;
char name;
};
分析
1.首先找最大类型 为int 4字节对齐。
2.给age分配4字节空间,占4剩0
3.上述剩余空间不够存储sex,所以再分配4字节给sex,占2剩2
4.上述剩余空间够name存放,剩余2字节,name占1剩1
5.所以总共分配了8字节的空间 sizeof(struct A)==8
可以看到按类型大小从大到小存放,可以有效解决资源浪费。
位域(段域)
struct A{
int age : 8;
short sex : 1;
char : 0; //空域,表示当前字节剩余7位用0填充表示不用,
//解决name跨字节存储的问题
char name;
}
如上例:一般人的年龄不可能大于256岁所以,8位足够存储一个人的年龄信息。性别只需要1位(0表示男1表示女)。如此优化后sizeof(struct A)==4
分析:
1.此时age只占8比特位,也就是一个字节,但是需要按结构体中最大类型来分配,所以给age分配4个字节,但是age只占1个字节,剩余3个字节也就是24位。
2.上述剩余字节足够存储sex,占1位剩余23位。
3.上述剩余空间足够存储name,占8位此时当前字节剩余7位再存8位name将跨越两个字节,是不允许的,所以使用空域,再将下一字节分配给name,所以总共剩余8位。
4.所以总共分配了4个字节,达到了最大化的空间节省
注意
1.使用位域不能输入值,必须在初始化时就指定具体值。

本文探讨了C语言中结构体的字节对齐原理,通过实例展示了如何通过调整成员变量顺序节省存储空间。同时,介绍了位域的概念,利用位域对结构体进行进一步的空间优化,以适应不同需求。位域可以限制变量的存储位数,减少内存浪费,但同时也限制了赋值方式。
3226

被折叠的 条评论
为什么被折叠?



