结构体,枚举,联合(重点:结构体内存对齐)

    今天小小白又来码代码了,今天又又又学习了许多新东西,就迫不及待来分享来啦;今天的重点是结构体内存对齐!!!

1:总:

 2:结构体

 举例·:

 3: 结构的自引用:

 一部分存数据(数据域),一部分存内存(指针域);

 4:(先了解一下)链表------

数据结构- 数据在内存中存储的结构

线型数据结构:顺序表,链表

顺序表: 链表:(无序的,但1有能力找到2...把他们都串起来)

 

树形数据结构:二叉树

 5:结构体变量的定义和初始化

 

 结构体嵌套:

 

打印:

 

 6:结构体内存对齐!!!

现在我们深入讨论一个问题:计算结构体的大小。这也是一个特别热门的考点,首先我们先来看一道题吧;试着算出它的答案。

 

   相信聪明的你已经做出来了,不会的也不要慌张;因为第一次的我也是一脸懵逼;

首先我们画出是s1的内存区域假设从箭头方向看为起始位置;而一个格子代表一个字节

;这样来看第一个格子相对起始位置的偏移量是0(以字节为单位来算偏移量),记为0,以此类推;接着再来看看从c1,i,c2的存放位置。

在此之前我们要先来了解一下offsetof(宏);它的头文件是#include

 用法:

 所以c1的偏移量为0,i的偏移量为4(并且i占4个字节);c2的偏移量为8;

 

总得为9个字节;那为什么最后答案是12呢?不要着急,我们接下来继续看;

    结构体的总大小,必须是最大对齐数(每个结构体成员都有一个对齐数,其中最大的对齐数就是最大对齐数)的整数倍;4是它的最大对齐数而9不是4的倍数因而继续往后延生到12是4的倍数;但是红色区域没用都浪费掉了;

我们再来看看s2为什么是8个字节;再用一次offsetof(宏)

 偏移量为8;正好是最大偏移量4的倍数;所以最后是8。

 

 所以结构体到底是如何对齐的?

了解结构体内存对齐规则:

1:结构体的第一个成员直接对齐到相对于结构体变量起始位置为0的偏移处;

2:从第二个成员开始,要对齐到某个【对齐数】的整数倍的偏移处;

对齐数:结构体成员自身大小和默认对齐数的较小值;

VS:默认对齐数是8

3:结构体的总大小,必须是最大对齐数(每个结构体成员都有一个对齐数,其中最大的对齐数就是最大对齐数)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整

体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

想必大家都学会了吧,那我们再来练习一个

 解析

 嵌套用法:

 解析:总的是32正好是所有最大对齐数8的倍数,所以是32

 

为什么存在内存对齐?(大部分的参考资料书说的是)

1. 平台原因(移植原因):

不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2. 性能原因:

数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问

 

 

 7:修改默认对齐数:#pragma pack()

 举例:

 

 8.结构体传参

两种方法:

 

 今天就先说到这里吧,下次又见啦!!!

 

 

 

 

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值