结构体如何节省空间——位域(段域)

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

普通节省空间的方法

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.使用位域不能输入值,必须在初始化时就指定具体值。
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值