返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 编程学习过程中越是痛苦的时…
 5 款家用投影机对比:当贝较…
 历史上的今天:“龙芯”点亮…
 深度神经网络每秒分类近20亿…
 Intel Arc A380显卡被做成MX…
 电竞酒店用上RTX 4090显卡:…
 4070显卡功率是多大 玩吃鸡帧…
 传言:宏碁新显卡使用AMD GP…
 价格下调性能却提升英特尔称…
 江苏天瑞光谱分析仪
 一文看懂2023CES:最佳科技盘…
 三星32:9超超超宽曲面显示器…
 个人电脑显示器
 电脑显示屏品牌网页设计展示…
 笔记本电脑显示屏贴图样机
 电脑cpu的种类和定义 什么叫…
 CPU十大排名
 拜登之子承认笔记本电脑是他…
 cpu温度过高怎么办?怎么样能…
 详解电脑cpu是什么
 老主板win11怎么安装 老主板…
 商住皆宜智能商务投影仪——…
 主板不够配件来凑!教你给老…
 【必买】长期使用电子屏危害…
 美国消费品安全委员会和华硕…
 内存条你插对了吗?为什么优…
 趁着双十一升级电脑主机高性…
 6800H+3050+28K 120Hz OLED:…
 五月轻薄本超值推荐华硕无畏…
 618华硕全线轻薄本推荐 选购…
 华硕灵耀X系列
 5499元 华硕破晓Pro 2022轻薄…
 三星发布奥德赛OLED G8电竞显…
 三星商用显示屏新品带来智慧…
 麻省理工开发出一种显示器的…
 三星OLED G8显示器开售39mm同…
 每日智讯-230202
 笔记本电脑处理器排行榜(苹果…
 2023年高性价比笔记本电脑推…
 电脑风扇声音大怎么办?具体…
 老款 CPU “免费升级”?这种…
 笔记本cpu排行榜2020
 告别高频高延迟!BIOS简单设…
 13代酷睿i5的当家花旦B760迫…
 电子巡更系统的安装方法及措…
 均不支持PCIe 50:AMD入门主…
 你知道为什么显卡一定要插第…
 显示器怎么选?别被参数花了…
 【必买】谁说便宜没好货!10…
 显示器市场现状 显示器行业未…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
编程学习过程中越是痛苦的时候学到的东西就会越多
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/2/4 11:54:02 | 【字体:

  绝命时刻和平使命三个月前,教研室里一个学长在华为南京研究院的面试中就遇到这个问题。当然,这只是面试中最基础的问题。如果问你你怎么回答?我的理解是这样的

  比如,在STM32的RTC开发中,我们需要数据来表示日期和时间,这些数据通常是年、月、日、时、分、秒。如果我们不用结构体,那么就需要定义6个变量来表示。这样的话程序的数据结构是松散的,我们的数据结构最好是“高内聚,低耦合”的。所以,用一个结构体来表示更好,无论是从程序的可读性还是可移植性还是可维护性皆是:

  如果说结构体有机地组织了对象的属性表示结构体“中看”,那么以修改结构体成员变量的方法代替函数(入口参数)的重新定义就表示了结构体“中用”。继续以上面的结构体为例子,我们来分析。假如现在我有如下函数来显示日期和时间:

  那么我们只要将一个_calendar_obj这个结构体类型的变量作为实参调用DsipDateTime()即可,DsipDateTime()通过DateTimeVal的成变量来实现内容的显示。如果不用结构体,我们很可能需要写这样的一个函数:

  显然这样的形参很不可观,数据结构管理起来也很繁琐。如果某个函数的返回值得是一个表示日期和时间的数据,那就更复杂了。这只是一方面。

  另一方面,如果用户需要表示日期和时间的数据中还要包含星期(周),这个时候,如果之前没有用机构体,那么应该在DsipDateTime()函数中在增加一个形参vu8 week:

  可见这种方法来传递参数非常繁琐。所以以结构体作为函数的入口参数的好处之一就是函数的声明void DsipDateTime(_calendar_obj DateTimeVal)不需要改变,只需要增加结构体的成员变量,然后在函数的内部实现上对calendar.week作相应的处理即可。这样,在程序的修改、维护方面作用显著。

  (3)结构体的内存对齐原则可以提高CPU对内存的访问速度(以空间换取时间)。

  并且,结构体成员变量的地址可以根据基地址(以偏移量offset)计算。我们先来看看下面的一段简单的程序,对于此程序的分析会在第2部分结构体成员变量内存对齐中详细说明。

  首先,我们来分析一下上面程序的运行结果。前三行说明在我的程序中,char型占1个字节,short型占2个字节,long型占4个字节。char_short_long、long_short_char和char_long_short是三个结构体成员相同但是成员变量的排列顺序不同。并且从程序的运行结果来看,

  所以,结构体成员变量的放置顺序影响着结构体所占的内存空间的大小。一个结构体变量所占内存的大小不一定等于其成员变量所占空间之和。如果一个用户程序或者操作系统(比如uC/OS-II)中存在大量结构体变量时,这种内存占用必须要进行优化,也就是说,结构体内部成员变量的排列次序是有讲究的。

  在这里,我就不卖关子了,直接给出如下结论,在没有#pragma pack宏的情况下:

  ·原则1结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

  ·原则2结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

  ·原则3结构体作为成员时,结构体成员要从其内部最大元素大小的整数倍地址开始存储。(structa里存有structb,b里有char,int,double等元素时,那么b应该从8的整数倍地址处开始存储,因为sizeof(double) = 8 bytes)

  先看看char_short_long和long_short_char这两个结构体,从它们的成员变量的地址可以看出来,这两个结构体符合原则1和原则2。注意,在char_short_long的成员变量的地址中,char_short_long.s的地址是1244994,也就是说,1244993是“空的”,只是被“占位”了!

  是不是这样就完毕了?不是,还有原则2。依据原则2的要求,char_long_short这个构造体所占的空间大小应该是其占内存空间最大的成员变量的大小的整数倍。假如我们到此就完毕了,那么char_long_short所占的内存空间是1244972~1244981共计10bytes,不合乎原则2,所以,必需在最后补齐2个bytes(1244982~1244983)。

  下面我们依照上述原则,来验证这样的分析是不是正确。按上面的分析,地址单元1244973、1244974、1244975以及1244982、1244983都是空的(至少char_long_short未用到,只是“占位”了)。假如我们的分析是正确的,那么,定义这样一个构造体,其所占内存也应该是12 bytes:

  可见,我们的分析是正确的。至于原则3,大家能够自己编程验证,这里就不再探讨了。

  所以,没论你是在VC6.0还是Keil C51,还是Keil MDK中,当你须要定义一个构造体时,只有你稍微留心构造体成员变量内存对齐这一现象,就能够在很大程度上节约MCU的RAM。这一点不仅仅应用于实际编程,在很多大型公司,假如IBM、微软、百度、华为的笔试和面试中,也是常见的。

  这三大块硬骨头是进修C语言的绊脚石,下功夫拿掉根本上C语言的大动脉就打通了,那么再去进修别的内容就相比照较简略了。编程进修过程中越是痛苦的时候,学到的东西就会越多,克服过去就会自己的技能,放弃了前面的付出的时长都将清零。越是难学的语言在入门之后,在入门之后越觉得过瘾,而且还容易上瘾。你上瘾了没?还是放弃了?

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 编程学习过程中越是痛苦的时候学到的东西就会… (02-04)
    普通电脑内存 5 款家用投影机对比:当贝较清晰海信画质相对… (02-04)
    普通电脑内存 历史上的今天:“龙芯”点亮操作系统;谷歌宣… (02-04)
    普通电脑内存 深度神经网络每秒分类近20亿张图像新型类脑光… (02-04)
    普通电脑内存 内存条你插对了吗?为什么优先第2、4插槽而不… (02-03)
    普通电脑内存 趁着双十一升级电脑主机高性价比内存条、固态… (02-03)
    普通电脑内存 计算机内存的基本知识详细说明 (02-02)
    普通电脑内存 内存储存器英文怎么写 (02-02)
    普通电脑内存 内存品牌大家都是国王 (02-02)
    普通电脑内存 请问主板存储空间显卡网卡声卡机箱等电脑配置… (02-02)
    普通电脑内存 电脑内存 (02-02)
    普通电脑内存 三星Galaxy S23内存缩水?标准版“开倒车”边… (02-01)
    普通电脑内存 内存供应什么是内存供应?的最新报道 (02-01)
    普通电脑内存 “内存Turbo”技术来了你的手机内存不怕不够了 (02-01)
    普通电脑内存 iPhone14会出8G运行内存吗 苹果有黑色的吗? (02-01)
    普通电脑内存 内存芯片崩盘 三星Q4营业利润大幅下降近七成 … (02-01)
    普通电脑内存 占用的英语短语 (02-01)
    普通电脑内存 内存分配英语怎么说及英文翻译 (02-01)
    普通电脑内存 小米终于在移动医疗领域动手了 (02-01)
    普通电脑内存 极限竞速地平线卡加载一直正在加载中解决办法 (02-01)