如何正确理解c语言sizeof结构体
1、首先我们看一下在本地机器上,基本类型占用的内存大小。如下图示例及运行结果所示:


2、我们定义一个结构体,结构体中包含char, int, double三种类型。(因为在笔者机器上,long与int占用内存一样,所以就不添加long类型了)。
并输出其占用内存大小,如下所示:


3、上例中,输出结构体大小并不等于每个成员内存大小相加。这是因为字节对齐的缘故。
为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”,比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除,也即对齐跟数据在内存中的位置有关。
以下列出字节对齐的规则:

4、由于字节对齐的缘故,虽然结构体中包含相同类型的数据成员,但如果它们的顺序不同,那么占用内存也可能会不同。
如下面例子,我们改变结构体中成员顺序,最终输出内存大小不一致。


5、根据字节对齐的规则,读者能分析出第二个结构体占用内存大小吗?
因为double类型地址需要被8整除,所以在char后填充了7个字节。而尽管int在double之后,地址也能被4整除。但根据规则第三点,最终结果需要被8整除,所以在int后还被填充了4个字节。

6、所以,对于计算sizeof结构体大小,我们需要掌握字节对齐的规则,了解内存结构,就能知道结构体大小。
在一些内存资源非常宝贵的地方,我们就可以通过调整结构体中成员顺序,从而达到减小对象大小,优化代码的目的。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
阅读量:69
阅读量:76
阅读量:150
阅读量:184
阅读量:165