结构体&内存对齐

目录

1>>闲话

2>>结构体类型声明及初始化

3>>结构体的自引用

4>>结构体内存对齐

4.1对齐规则

4.2>>为什么要对齐规则,这不是浪费了很多空间?

4.3>>修改默认对齐数

5>>总结


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的总大小为16Stu的最大变量就是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>>总结

        结构体目前我还没做过例题,不知道具体用法,只知道概念,有知道的大佬可以在下方评论区探讨探讨,多多交流,谢谢大家,小编还在军训,军训结束应该会长期更新,先给我的断更说句对不起希望大家能够喜欢我的文章!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫の大一

谢谢大佬,我会三连你的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值