关键字struct

关于struct这个关键字,下面讨论了它的内存对齐位段的tips

下面的代码是对普通结构体的内存对齐的验证:

struct ss11
{
	char ch;
	int a;
};
void Test11()
{

	struct ss11 s;
	printf("%p\n", &s.ch);     //可以对普通结构体的成员取地址
	printf("%d\n", sizeof(s)); //计算这个结构体的大小
}

下面的代码是对位段的测试:

情况一:

struct my_bit
{
	unsigned short _a : 4;//因为该位段的类型是short,所以会开两个字节的空间
	unsigned short _b : 5;//因为第二个位段的类型也是short,编译器会看看前面开的空间是否能够
                          //再容纳下该位段。若容得下就不会再开空间了;否则就会开空间。
};
union un
{
	int i;
	char ch;
};

void Test11()
{
	union un u;u.i = 1;
	if (u.ch == 1)printf("小端\n");//小端:低位序放在低地址,高位序放在高地址
	else printf("大端\n");         //大端:低位序放在高地址,高位序放在低地址

	struct my_bit i;
	memset(&i, 0, sizeof(i));
	i._a = 13; i._b = 1;
	printf("%d\n", sizeof(i));
	short it = *(short*)(&i);
	printf("%d\n", it);
}

 

情况二:

struct my_bit
{
	unsigned short _a : 5;//因为该位段的类型是short,所以会开两个字节的空间
	unsigned short _b : 13;//因为第二个位段的类型也是short,编译器会看看前面开的空间是否能够
                          //再容纳下该位段。若容得下就不会再开空间了;否则就会开空间。
};
union un
{
	int i;
	char ch;
};

void Test11()
{
	union un u;u.i = 1;
	if (u.ch == 1)printf("小端\n");//小端:低位序放在低地址,高位序放在高地址
	else printf("大端\n");         //大端:低位序放在高地址,高位序放在低地址

	struct my_bit i;
	memset(&i, 0, sizeof(i));
	i._a = 13; i._b = 1; 
	printf("%d\n", sizeof(i));

	int it = *(int*)(&i);
	printf("%d\n", it);
}

 

情况三:

struct my_bit
{
	unsigned short _a : 4;//因为第一个位段的类型是short,所以先一次性开2个字节的空间
	unsigned int _b : 5;//因为第二个位段的类型是short,所以会再开四个字节的空间
};
union un
{
	int i;
	char ch;
};

void Test11()
{
	union un u;u.i = 1;
	if (u.ch == 1)printf("小端\n");//小端:低位序放在低地址,高位序放在高地址
	else printf("大端\n");         //大端:低位序放在高地址,高位序放在低地址

	struct my_bit i;
	memset(&i, 0, sizeof(i));
	i._a = 13; i._b = 1;

	printf("%d\n", sizeof(i));
	long long it = *(long long*)(&i);
	printf("%lld\n", it);
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值