龙空技术网

《鹏哥C语言第一课》第115.9讲 结构体内存对齐举例(3)

鹏哥C语言 370

前言:

现时同学们对“结构体例题详解及答案”都比较珍视,我们都想要知道一些“结构体例题详解及答案”的相关资讯。那么小编同时在网络上网罗了一些有关“结构体例题详解及答案””的相关文章,希望我们能喜欢,朋友们快快来了解一下吧!

主页金裙拿课件。

同学们,上个视频里其实已经给大家介绍清楚了结构体内存对齐的规则,但是实际上有一条第四条一直没有讲。紧接着下来再给大家一个例子,把第四条讲清楚。

在这地方再给出一个结构体的定义,struct S4比较特殊的点在于里面有一个char c1成员,又有一个struct S3的成员。S3struct S3就是前面结构体,也就是在S4里面嵌套了一个S3这样一个类型的变量。结构体里面是不是有个结构体?S4里面有个成员是S3,紧接着写上d。

现在如果去算S3的S4的大小,S3也知道了。如果有同学说算一下S4的长度,这个时候怎么算?这就涉及到了刚刚讲的第四条的规则。

先把它拿过来,然后再把这个,主要是要创建一个S4,这个叫S3。当去创建S4的对象的时候,它的长度是多少?拿过来,在这地方依然还是一样的把内存再给大家拷过来。假设在创建S4的时候,依然是从这个位置开始,从这个位置开始它的下面字节就是偏移量为0的位置。

这个地方怎么来往进存放成员?还是一样的道理,c1想往进放,放到0偏移处,c1放到0偏移处就是这,c1是char类型的,只占一个字节,所以就把c1就放进去了。这是c1,c1放进去之后紧接着下面放的S3,S3是个结构体变量,S3这个结构体变量其实在上一个视频给大家讲过了,它其实长度是多少?16个字节,它的长度肯定是16个字节,这毋庸置疑。

但是S3从哪儿开始对齐?我从哪儿开始对齐?我不知道,那怎么办?大家注意,这个时候再回过头来看刚刚的规则里边的第四条,第四条规则其实就是适用于嵌套的这种情况。

同学们,我拿过来,这个第四条规则我再拿过来说,如果嵌套了结构体的情况,嵌套的结构体成员要对齐到自己的成员中最大对齐数的整数倍数。刚刚前面我在算S3的时候,S3它的成员的对齐数是8,C的对齐数是1,I的对齐数是4,三个对齐数里面最大的是8。

所以当S3嵌套在S4里面,S3存储的时候,它要对齐到哪里?它要对齐到自己的成员中最大对齐数的整数倍处。S3的最大对齐值是几?是8,所以S3这个成员在这儿存储,在S4里面这个位置,只要对齐到4,8的倍数处就可以了。

最大对齐数的整数倍处吗?自己成员中最大对齐数的整数倍处,也就说S3要对齐的8的倍数处。紧接着下来,偏移量1234567这七个字节,大家注意,都不是8的倍数,所以要8的倍数应该是从这开始。

我这个地方S3要占16个字节,所以12341234,8个字节对吧?12341234,16个字节就给进去了。注意这个红色的区域是我的S3,我把它全部放进去了,然后再来放我的d,d自身大小是8,默认对齐数是8,它的对齐数就只能取8了,d只要对的8的倍数处就可以了。

紧接着下来,同志们来看,紧接着下来,大家看这个24偏移量是8的,是不是8的倍数?是的,所以d从这开始,连住占8个字节就可以了。我给8个字节,这就是我的d成员,我就放进去了。

当d成员放进去之后,大家注意,我现在把三个成员是不是全部放进去了,0偏移一直到31偏移,大家注意,最后一个字节是不是就刚我们31偏移,总共这地方应该占了32个字节。

32是不是我最终这个结构体的大小,我们还是要看我们的第四条规则,说结构体的整体大小,就是所有最大对齐数的整数倍。这个所有最大对齐数包含什么?包含嵌套结构体成员中的对齐数。

这个c1但S4,S4里边有c1有d有S3,对吧c1自身大小是1,默认2对齐数为8,它的对齐数就是1。这个d的默认2对齐数是自身大小是8,对齐数默认对齐数是8,自身的对齐数就是8。

那S3里面刚刚我们算过,它的对齐数最大是几?8那所有成员它的是1,它的是8,它里面最大是8,对不对S3里面最大是8,那对齐数最大的也就是8了。结构体的总大小必须是所有成员的,包含嵌套成员里面的那个最大对齐数,那个对奇数里边最大的那个对奇数的整数倍。

那这个地方,最大对奇数无非也就是8,32是不是8的倍数?是的所以,这个地方后面还要不要浪费空间了,不需要了,我们这个地方取了32就可以了。那也就说S4它的大小应该是32,我们这地方验证一把就知道了。

代码这么一走,大家看32就出来了。同学们,你看即使是结构体里面,嵌套了其他的结构体,你会发现,它的大小是不是依然是可算的。我们就把这4条规则是不是灵活的应用起来了。

前三条规则是针对着普通的结构体的,而第四条规则是如果嵌套了结构体,结构体里面嵌套了结构体,那该怎么去做?只要把这4条规则讲清楚、理解清楚,对于结构体内存对齐的规则就理解清楚了。结构体在结构体成员在内存中怎么存放,它们所占空间的大小就可以很合理的进行计算了。

同学们听到这个地方,我相信通过前面的一系列的视频已经给大家讲清楚了结构体内存对齐的各种规则。同学们听到这如果大家觉得听懂了,觉得还不错,有所收获,请记得给鹏哥点个赞,点个关注。这个视频讲到这里,下个视频再来继续往后探讨。

标签: #结构体例题详解及答案