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