结构体长度的计算

sizeof(struct) = ? 想必大家都会用sizeof(),也知道在什么地方应该用sizeof(),或许在大多数时候也清楚地知道sizeof()的返回值是多少。 今天我就和大家一起来研究一下对于一个普通的C/C++的结构,我们对它使用sizeof()得到的结果是什么呢?注意,本文的所有内容都是在x86 windows XP上用VC6提到的结果。 让我们先来看几个结构的定义: struct SampleC { char c; char i; char d; char e; }; struct SampleB { int i; SampleC d; char c; }; struct SampleA { int i; SampleB b; char c; }; OK, 现在我们分别对它们使用sizeof(),来看一下它们的结果是多少呢? 1) sizeof(SampleC)最简单,每个char占用一个字节,那么一共4个char,所以sizeof(SampleC)的结果就是4 2) sizeof(SampleB)的结果是多少呢?前面已经知道sizeof(SampleC)的结果是4,再加上一个int=4,再加上一个char=1,那么它的结果是不是就等于9呢?大家或许会说了,当然不是喽!对了,当然不是9,它的结果是12。能想一想是为什么吗? 3) 好,再来看sizeof(SampeA),这和sizeof(SampleB)是一样的,我们直接给出答案,它的结果是20,看看跟您想的是不是一样的呢? 现在,我们稍微修改一个SampeC的定义,将它的定义修改如下: struct SampleC { char c; double f; char d; char e; }; 现在,大家来算一个这3个结构的sizeof()分别是多少呢?看看你的想法跟实际结果是不是一致的呢? sizeof(SampleC) = 24 sizeof(SampleB) = 40 sizeof(SampleA) = 56 怎么样?您算对了吗? 让我们来研究一下为什么会得到这样的结果呢。其实秘密就在那个double的字段上,大家知道,double类型的变量占用8个字节,所以分配它的时候需要从8的整数倍开始分配。这样会导致以下两个结果: 1. double字段要从8的整数倍开始分配内容 2. 整个结构的大小必须是8的整数倍 由此,对于SampeC来说,char c本身只占用一个字节,但是由于紧接它的字段double需要从8的倍数开始分配,所以它实际上占用了8个字节。 然后,char d和char e分别占用一个字节,总共两个字节。可是因为结构的大小必须是8的整数倍,所以它们合起来也要占用8个字节。 当然,它们本身占用不了那么多,多出来的是填充字节,我们没有办法直接访问的。这样一来,整个结构的大小就是24了。怎么样?想到了没有? 知道了SampleC的大小,其它的两个结构的大小也就很容易地就可以出来了,因为它们包含了SampleC,而SampleC是8字节对齐的,它们也需要以8字节对齐。 综合以上,我们得出用sizeof()计算结构大小的几个经验: 1. 找出结构中及它所包含的子结构中对齐量最大的字段 数据类型 对齐量 (指针) 4 char, unsigned char, signed char 1 short, unsigned short, signed short 2 int, unsigned int, signed in 4 float 4 long, unsigned long, singed long 8 double 8 2. 所有字段都必须是以它的对齐量对齐的,例如int必须以4对齐,char必须以1对齐 3. 最后,整个结构是以所有字段的最大对齐量对齐的 那好,最后我们再来看一个例子,来算一个它的sizeof()是多少: struct SampleTest { char c; int i1; double f; char d; short s; char e; int i2; }; 看看你算的和我算的是不是一样的,我算出来的结果是32. 谢谢大家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值