位段和联合体的内存分配及大小计算

目录

 

一、位段

二、联合体


 

一、位段

 
        位段一次开辟1或4个字节的空间,不够再继续开辟。
struct A {
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;
};

int a : 2;        给a分配两个bit的内存空间

因为a的参数类型为int,一次开辟4个字节

a占2bit,b占5bit,c占10bit,d占30bit

因为a、b、c总共占了17个bit,剩下的内存大小为4*8-17=15<30,舍弃掉这15个bit

int d时再开辟4个字节的空间

所以struct A的大小为8字节

 

struct B {
 char a:3;
 char b:4;
 char c:5;
 char d:4;
};

char a : 2;        给a配3个bit

因为是char类型所以一次开辟1个字节

sizeof(struct B)= 3

 

二、联合体

        联合体中的成员共用一块空间
        联合的大小至少是最大成员的大小。
        当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

union Un
{
	int i;
	char c;
};
union Un un;

int main() {

	printf("%d\n", &(un.i));
	printf("%d\n", &(un.c));

	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x\n", un.i);
	return 0;
}

运行代码我们可以看到,un.i和un.c的地址是一样的,证明两个成员确实共用了一块内存空间

而且由于vs是小端存储,一开始un.i=0x11223344把内存改为了44 33 22 11,之后un.c=0x55把内存改为55 33 22 11,输出结果为11223355

接下来再看联合体的大小

union Un1
{
 char c[5];
 int i;
};
union Un2
{
 short c[7];
 int i;
};

对Un1,虽然c占5个字节,i占4个字节,但是当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。c是最大成员,其对齐数为1,i的对齐数为4,所以要对齐到4的整数倍8,Un1的大小就为8个字节

对Un2,c占14个字节,i占4个字节,c是最大成员,其对齐数为2,i的对齐数为4,所以要对其到4的整数倍16,Un1的大小就为16个字节

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值