计算结构体的大小(字节对齐问题)

C代码中定义的结构体是一块连续内存,各成员按照定义的顺序依次在其中存放。编译器在完成语法分析后,需要计算它的大小,然后才能正确地为结构体分配空间。为了让结构体的所有成员都能正确、快速地访问,需要字节对齐

字节对齐体现为:

在成员之间可能增加补齐字节,以调整每个成员的偏移;

结构体末尾,也可能增加补充字节。所有补齐字节计入结构体的大小。

我们通过以下几个例子认识结构体大小知识:

1、

struct B
{
	char a;//1+3
	int b;//4
};        //8
printf("%d\n",sizeof(struct B));

因为考虑内存对齐,此时struct B 的大小为8。

2、

struct C
{
	char a;//1+1
	short b;//2
	int c;//4
};//8

struct D
{
	char a;//1+3
	int b;//4
	short c;//2
};//10+2

通过结构体C和结构体D看出,不同数据类型存放顺序不同,结构体大小不同。

3、

struct A
{
	int a;//4
	char b;//1
};//5+3

 

105不能被4整除,在其末尾添加填充3字节。注意与结构体B区别。

同等情况案例:

struct H
{
	char a;//1+3
	int b;//4
	double c;//8
	int *d;//4
};//20+4

4、

struct II
{
	int a;
	char b;
};

struct I
{
	float x;//4
	//struct II y;//8
	double y;
};//12  单个最大类型

结构体总的大小要是其成员中最大size的整数倍,如果不是编译器会在其末尾添加填充字节

总结:

  1. 结构体第一个成员的地址和结构体的首地址相同
  2. 结构体每个成员地址相对于结构体首地址的偏移量(offset)是该成员大小的整数倍,如果不是则编译器会在成员之间添加填充字节(internal adding)。
  3. 结构体总的大小要是其成员中最大size的整数倍,如果不是编译器会在其末尾添加填充字节。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值