0
点赞
收藏
分享

微信扫一扫

关于结构体对齐

干自闭 2022-02-06 阅读 105
p2plinqgnu

首先我们先了解一下各数据类型所占的字节数

 

 


 下面开始正文,结构体对齐。

首先我们要知道什么是结构体,官方点的语言来描述,结构体是C/C++语言中一种用户自定义的可用的数据类型,它允许用户存储不同类型的数据项。

当我们定义一个结构体类型,并且定义出一个该类型的变量时,系统会根据其默认的规则在内存中为结构体申请相应大小的空间——就如我们所理解的基本数据类型变量的定义一般。

而C/C++作为接近底层且高效的语言,结构体究竟依照什么样的规则在内存中申请空间便是我们所必须要了解的一个知识点了。

这里我们要提到一个东西:

 用简单点的话来说就是——把东西按照规则放在合适的地方。

关于为什么要有内存对齐,很多参考资料上如是说:

这涉及到了一些深层次的知识点,所以我也只能这样照搬过来,具体理解后,可能会在后续的博客中解释 。


这应该属于比较官方的释义——大部分的博客中是这样写的。

但对于很多人来说这样的确会给不少人带来阅读理解上的麻烦,并且在实例的判断上也有些麻烦。

因此,我们可以通过如下方式来计算结构体的大小:

struct stu {
    char name;
    double a;
    int id;
    char grade;
};

第一步:确定结构体的最大对齐数——即结构体中 最大数据类型的大小 与 默认对齐数 二者之中的较小值。

如上方例子中,最大数据类型即double,占8个字节,而VS中的默认对齐数为8,二者相等,较小值也为8。这里并不能体现出,后续会有修改。

第二步,将从起始位置开始的内存看作一个个大小为最大对齐数的小单位,将结构体中的结构变量依次放入这些单位中。

如果该单位剩余空间可以放下下一个结构变量,则将下一个结构变量紧接着前一个结构变量放入。

相反,如果该单位的剩余空间不足以放下下一个结构变量,则将下一个结构变量放到下一单位起始处(如果该结构变量足够大,它可能会占数个单位)。

重复此过程。

对于结构体中所包含的结构体,在计算最大对齐数时,往往不将被包含的结构体看作一个成员变量,而是将其包含的成员变量单独拿出来比较计算的。

可以认为最大对齐数是通过 结构体包含或间接包含基本数据类型/指针类型的所占空间最大值 与 系统默认对齐数 二者的较小值。

 

 

可见数组类型在内存对齐的规则中是不会将它看作一个整体的。此图中结构体struct stu中的元素所占空间最大的是char[16],占了16个字节,而系统所根据的最大对齐数确实8个字节。char[16]在此处只是被看作了16个char变量。 

 

不得不说当你理解了一个方法之后,如何将它简单而又清楚的讲出来也是一件很有挑战的事,显然我是没有这样的天赋的。

举报

相关推荐

0 条评论