目录
1>>闲话
好久不见,我这段时间去旅游了,以及刷了刷题,我这几天也都在军训,刚上大一,事情有点点多,今天体检没有军训,就来接上次内容,学习了一下结构体。
2>>结构体类型声明及初始化
首先来用学生为例子,包括名字,年龄,身高,体重为例,声明这个结构体,对它进行初始化。
上面就是以我为例子,声明出来的一个结构体, 以及对它做了初始化和打印。
3>>结构体的自引用
如果要对结构体进行嵌套,我们正常是这样想的:
可是仔细看看,会发现计算大小后是趋于无限大的,name、age、height、weight这几个变量是固定的,而struct Stu会进行叠加,所以这样是出不来结果的,那如果咱们要进行自引用,就要用到结构体指针>>
就把structural Stu加个星号就好,指针大小是4或者8个字节,也可以指向到下一个结构体类型,那么这样就完成了结构体的自引用。
4>>结构体内存对齐
4.1对齐规则
这里可以看到结果是12,为什么是12呢?这里就要讲到对齐规则:
第一点:大部分编译器默认的最小对齐数是8,结构体内变量大小存放到内存中,使用最小对齐数和结构体内变量的较小值的整数倍,存放到内存中,例如char a;是1字节,跟8比来的小,所以存放到内存中1的整数倍最小就是1字节,int b;是4字节,跟8比也来的小,存放到内存中4的整数倍最小就是4字节,所以int b使用的内存空间为5-8,此时就浪费了2-4这些空间,int c也是同理。得结果为12.
第二点:结果12不完全靠上面得来,使用结构体内变量最大值的整数倍,此时以第一点为例那就是4,刚好12在4的倍数上,所以是12,若此时还有一个double类型,那么8的整数倍又要大于等于12,那结果就是16.
第三点:嵌套要对齐自己的最大变量,以下面的代码为例子:
#include<stdio.h>
struct Stu{
double a;
char b;
int c;
};
struct Stu2{
char a;
struct Stu s;
double c;
};
int main()
{
printf("%d",sizeof(struct Stu2));
return 0;
}
得a为1-8,b为9,c为13-16,根据前面计算出Stu的总大小为16,Stu的最大变量就是a也就是8个字节,接着看Stu2,char1,嵌套要对齐自己的最大变量,所以Stu2是9-24,最后double,8得出32,32也是8的整数倍,所以最终结果为32
4.2>>为什么要对齐规则,这不是浪费了很多空间?
我相信很多朋友都有和我一样的疑问,那么我现在来告诉大家,很多编译器的底层规则不一样,为了使大家统一就要有这个规则,这是其一,其二是:就算char读完读int,那么并不是说1访问完访问2-5,而是访问1-4,在访问5-8,因为int是四个字节,所以访问也是四个四个一起访问,此时还得去看看占用几个,耗时更长。那么肯定没有一次性访问完四个有内容的字节来的快。所以对齐规则也就是再用空间换时间。
4.3>>修改默认对齐数
这个比较简单只需要加一行代码即可:#pragma pack(value)
根据前面的对齐规则,就能得出6,现在改成2大家先猜猜答案是多少?
答案是8,恭喜答对的小伙伴,char1个,int4跟2比2小,所以从2整数倍开始,所以是3-6,char7,最终使用2的整数倍因此就是8.
5>>总结
结构体目前我还没做过例题,不知道具体用法,只知道概念,有知道的大佬可以在下方评论区探讨探讨,多多交流,谢谢大家,小编还在军训,军训结束应该会长期更新,先给我的断更说句对不起,希望大家能够喜欢我的文章!