当前位置: 首页 > wzjs >正文

安徽海川建设公司网站注册网站租空间哪里租

安徽海川建设公司网站,注册网站租空间哪里租,国外域名购买网站,广告网站建设实训报告结构体内存对齐 1、引子2、内存对齐2.1、结构体成员的偏移量2.2、结构体内存对齐规则2.3、结构体内存对齐原因2.4、修改默认对齐数 1、引子 关于结构体的内存规则这一话题的研究我们可以通过计算结构体大小来引入。 例题&#xff1a; #include<stdio.h>struct stu1 {c…

结构体内存对齐

  • 1、引子
  • 2、内存对齐
    • 2.1、结构体成员的偏移量
    • 2.2、结构体内存对齐规则
    • 2.3、结构体内存对齐原因
    • 2.4、修改默认对齐数

1、引子

关于结构体的内存规则这一话题的研究我们可以通过计算结构体大小来引入。

例题:


#include<stdio.h>struct stu1 
{char a;char b;int n;
};struct s
{char a;int n;char b;
};int main()
{printf("stu1:%zd\n", sizeof(struct stu1));printf("s:   %zd\n", sizeof(struct s));return 0;
}

从题中可以看出,结构体stu1和s用有相同的变量,只不过它们的创建顺序不一样,大家认为它们的结果各是多少呢?

结果:
在这里插入图片描述
只是创建顺序发生了变化,它们的结构体大小就不一样,所以我们可以推断,这两中结构体的内存创建过程肯定是不一样的。

2、内存对齐

2.1、结构体成员的偏移量

什么是偏移量呢?
偏移量是指变量距离首地址的距离,运用到结构体上就是结构体各变量距离结构体起始位置的距离。
在C语言中有一个宏,它可以计算偏移量,他就是offsetof,它在<stddef.h>头文件下,我们可以使用它来看一下。
以stu1为例
代码

#include<stdio.h>
#include <stddef.h>struct stu1
{char a;char b;int n;
};int main()
{printf("a:%d\n",offsetof(struct stu1,a) );printf("b:%d\n", offsetof(struct stu1,b));printf("n:%d\n", offsetof(struct stu1,n));return 0;
}

结果:
在这里插入图片描述
那这个结果又能说明什么问题呢?
我们可以画图说明:
在这里插入图片描述
我们根据它的偏移量可以画出这样一幅图,我们从图中可以发现0-7一共是8个字节,正好符合我们的结果。
我们从上图也不难发现,我们浪费了两个字节,这就和结构体的对齐规则有关。

2.2、结构体内存对齐规则

1、结构体的第一个成员对齐到和结构体变量的起始位置偏移量为0的地址处。详情可以看上图的变量a
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数: 编译器默认的一个对齐数(vs2022中默认是8)与该成员变量字节大小中的较小数。
(例如:在vs2022中假如在结构体中有int n,它是4个字节,比8小,那它的对齐数就是4).
3.结构体总大小为最大对齐数的整数倍
4、如果结构体中嵌套了结构体,结构体的整体大小,就是所有最大对齐数的整数倍(含嵌套结构体中的成员的对齐量)

练习1:

struct stu
{double s;char c;int n;
};

结果:16
在这里插入图片描述
其中它们最大的对齐数是8,而全部放入后总大小是16,是8的整数倍,不用改变。
练习2:

struct stu
{double s;int n;char c;
};

结果:16
虽然也是16,但是情况不同:
在这里插入图片描述
这种情况下,全部创建完成之后是13个字节,但最大对齐数是8,13不是8的整数倍,所以答案是16.
练习3:

#include <stdio.h>struct s1
{int m;char g;short k;
};struct stu
{double s;struct s1;char c;
};int main()
{printf("%zd", sizeof(struct stu));return 0;
}

结果:24
这个就留给大家思考,我什么问题,在评论区留言,博主看到后会回复的。

2.3、结构体内存对齐原因

至于为什么会存在内存对齐
1.平台原因:
不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平台上只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2.性能原因
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次。假设一个处理器总是从内存中取8个字节,那么地址必须是8的倍数。如果我们能保证将所有double类型数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读值或写值了,否则,我们可能要执行两次内存访问,因为对象可能被放在两个8字节内存块中。
总的来说:结构体的内存对齐,是拿空间来换取时间的。

2.4、修改默认对齐数

在C语言中默认对齐数也可以被修改。

#pragma pack(4)

这样就把默认对齐数修改为4了,再恢复之前的默认对齐数也很简单,只需再次添加语句就好只不过这次括号里不用添加数字。

#pragma pack()

这样就取消了。

好了,本期博客到这里就讲完了,
有什么疑问或者有什么看法在评论区留言哦,看到后会回复的。

我们下期博客再见~
(~ ̄▽ ̄)~

http://www.dtcms.com/wzjs/835919.html

相关文章:

  • 企业网站设计制作教程wordpress全站静态
  • 网站布局f网站建设脑图
  • 企业营销微网站建设没有网站 可以做cpa
  • 自己怎么做卖东西的网站东莞网络优化
  • 响应式网站 翻译代码wordpress 未加密
  • 最超值的锦州网站建设济南网站优化公司电话
  • 表白时刻网站上海外贸公司地址
  • 瑞安规划建设局网站陕西网站建设
  • 马云有没有学过做网站WordPress担保系统
  • 济南企业网站设计公司wordpress更改首页
  • 重庆营销型网站随做的好处wordpress轮播图源码
  • 设计商标的网站加工平台调平装置
  • 俱乐部网站模板哪个网站可以领单做效果图
  • 建设一个网站大概多少钱网站建设编程时注意事项
  • 免费建站免费网站海文考研培训班2023价格表
  • 浙江省网站集约化建设通知上海公共招聘网下载
  • 哪些门户网站可以做推广网站建设静态部分实训总结
  • 邯郸有学做搭建网站的吗如何注册公司微信公众号
  • 网站建设中英语深圳官网建站服务商
  • 网站发布之后上传文件路径变了迅雷下载宝 做网站
  • 网站模板下载之后怎么做什么播放器能看无线新闻台直播
  • 青海省住房和城乡建设厅 网站天河网站建设
  • 网站设计就业岗位分析门户网站开发需求文档
  • 网站文章结构变更怎么做301茂名营销型网站制作公司
  • 做带会员后台的网站用什么软件长沙短视频公司
  • 怎么建立自己的网站平台营销型网站易网拓
  • 厚街响应式网站建设服务器备案期间网站
  • 有没有便宜的网站制作百度爱采购推广怎么入驻
  • 个人电脑建立网站会什么样的网站快速盈利
  • 广州开发网站服务器安全配置