结构体的相关知识以及内存对齐的计算(包会)

结构体类型:

C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类 型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问 题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。

结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如: 标量、数组、指针,甚⾄是其他结构体。

结构体变量的创建和初始:

比如我们想要描述一个学生的属性,就可以通过结构体来说明。

 struct Stu
 {
     char name[20];//名字 
     int age;//年龄
     char sex[5];//性别
     char id[20];//学号
 }; //分号不能丢
 

这就是最基础的结构体变量的创建和初始化

并且在访问结构体成员的时候可以通过   结构体变量.成员名或者结构体指针->成员名来访问

重点——介绍结构中存在的内存对齐:

我们已经掌握了结构体的基本使⽤了。 现在我们深⼊讨论⼀个问题:计算结构体的⼤⼩。 这也是⼀个特别热⻔的考点:结构体内存对⻬

对齐规则:

 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处

2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。在VS中默认对齐数是8Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩

3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

下面我们举例:

那么为什么会显示的12,而不是9呢?这是因为对齐规则3,所以结果必须是4的倍数

下面再看一个例题:

这个两个题目在结构体变量当中其变量是相同的,不过对于结构体变量的顺序是不同的,所以导致struct所占的内存大小是不同的,所以在我们创建结构体以及结构体成员变量的时候,可以将相同类型的变量放到一起,这样可以节省内存空间,大大提高了内存空间的利用率

下面我们在尝试一个题目的计算

这题的答案是16,各位读者不知道有没有算对!!!

这就是上面例题的解析图。

修改默认对⻬数:

#pragma 这个预处理指令,可以改变编译器的默认对⻬数。

重新定义了编译器的默认对齐数,那么对齐规则2就需要自己重新进行判断。

结构体传参:

上面给函数传递数据的时候,可以进行传递地址也可以进行传递参数,那么我们应该如何选择,选择哪一种方式更加的合适呢?答案肯定是传递地址更加好,原因如下:

结论: 结构体传参的时候,要传结构体的地址。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值