结构体的内存对齐

简介

结构体的内存存储并不是紧密排列的, 从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始。 内存对齐可以大大提升内存访问速度,是一种用空间换时间的方法。因此也会造成一部分的空间上的浪费。

结构体内存的计算

废话不多说直接给各位上代码以及上图解析。

结构体的内存对齐_第1张图片

这两个结构体内部存储类型都一样只有顺序不一样那么他们的内存会是一样的嘛?答案是不一样我们可以运行一下。

他们的答案一个是16一个是24,这个结果告诉我们结构体的内存的计算绝对不是简单各种类型所占内存的相加而是其中有自己的规则。那么这个规则就是内存对齐。内存对齐的概念就是元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小(通常它为4或8)来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始,这就是所谓的内存对齐。

结构体的内存对齐_第2张图片

从这张图片我们可以直观的看出来内存对齐的效果首先首元素a放入整型占据四个字节,之后是字符c占据一个字节偏移量是1因此可以直接紧挨着放入,担当放入double的时候因为他的内存是8个字节也就是说他的偏移量应该是8而他即将放入的方块中偏移量为五不是8的倍数因此他应该是从偏移量为8的方块放入占据八个字节那么这个结构体总共就相当于占据了16个字节。

提示

因此我们可以用同样的道理算出另一个例子的内存大小这里要提示一下文中所用的偏移量的大小在windows操作系统中取得是8与该类型所占内存大小的较小值,而linux操作系统中的则是指该类型的大小。

你可能感兴趣的:(C语言,c语言)