00:00
大家讲的是结构体的这个定义和格式,以及它的使用方式,是不是啊,那这里面有一个大家同学刚才没看清那一个,我再给大家放大一点啊喂喂喂啊喂喂,现有声音了吧,好,那为什么就是这个两个同学说没区别,有区别吗?有是不是有区别,但是这个细微差别在哪呢?这里面是不是有一个呃,Ru student I啊是不是,呃,这里面是不是没有这句话呀,这句话是不是在这呢?是不是定义结构体的时候就定义了一个结构体变量啊,是这样的情况,当然这个结构体变量可以怎么直接赋值,是不是咱们也看了吧?还有方式就怎么是结构体可以定义多个变量名称。比如叫STU1逗号STU2逗号STU3,是不是可以这样,也可以这样多个定义啊,这是它的格式啊,这是逗号写错了吗?再写个逗号啊,这个写错了,这个逗号呢?啊,这个没错了吧?啊这是可以定义多结个底面量,你可以这样直接等号给它负值,这样给的怎么样等号具体赋值,但是这里面值必如果你写等呃写这个等号括号之后必须把值写上去,否则情况下是不对的啊啊这是注意一下,这是结构体的变量与呃是定义与负与赋值操作再退回来啊。
01:17
啊好,那我们来看一下啊,下面讲课内容啊,是结构体的这个大小,以及它的内存存储情况。操整的我都不会了,这这怎么关呢啊这呢啊右击同学说看不清屏幕,让我放大一点。来来,我不用你教,我也会卡R加他也新建知道吧,我只是想通过这里面新建而已啊,右击添加新建项,你还教我了是不是,第二是结构体,结构体大小。和内存结构。点C,好,这里面我去写下这个代码啊,先定一下结构体,在程序中,这个结构体是可以共用的怎么的,就是你在这里面定义个结构体,我在这里面是不是也可以使用啊,啊这是共用的,可以共用的,而且你看它写的是函数的外面,没写在函数的里面,注意一下啊,啊,我写在它上面情况下就不需要怎么声明了吧,是不是结构体也需要声明啊,或者是一般情况下结构体都写在一个单独的H文件中,知道吧,就是写在H文件中,它没有对应的点C文件知道吧,就是一个H文件中我想使用情况调这个什么呀,调这个是点H文件就可以使用了,知道吧,点H文件就做做一什么,做一个结构体的数据存储的操作,知道吧?啊,这个是相当于如果说你学过Java,就像加va宾一样,是不是啊。
02:41
那那这里面再写个结构体啊,这俩结构体名字就不能冲突了,不能一样了,比如说这叫student,这叫什么。这叫S就可以了吧?啊,不能重名sto。Truttru加上名字叫stus,快括起来,这里面来写一下是差类型的name,然后是20。
03:08
然后再写一个呃,无符号的UN int类型的age是年龄,再来个电话号,差类型的TEL,写个十五十五就行了,然后再来什么?再来一个float类型的一个数组是scores,和之前是一样的三门,三门成绩,然后再来一个是差类型的星,呃,不是差类型的。Sex是性别啊,这是它的人物属性,属性之后我这里面直接写个什么,直接写个STU是不,我在这里面怎么就不需要怎么着不需要这个再给它初始化了吧,ST不用了吧,直接来个ST是不是就可以操作了,点name是不是就可以操作了,那但是这个点是不是有问题的啊,得需要string copy,那这里面计算一个东西啊,是pful,然后括号打印下什么,打印下这个叫结构体。
04:00
大小。看一下他在内存中这个大小是百分号D逗号。赛道后是个什么?是一个,这个是STU。ICU是个什么?是一个结构体变量嘛,是不是,那它是不是可以直接写啊,那直接看一下它的大小,看一下大小多大呀。多大,那这里面这个是不是大家搞混乱了是吧,比如说是整形数组,好好考虑怎么怎么大小啊,是不是它就乘就是它的个数元素个数再乘以一个元素的,呃大小是不是就行了,这里面呢?这里面正常情况下是呃结构体里面是把所有的都相加起来,那比如第一个是20,那是20再加一个,这个是几个,四个大小这是多少个,15个再加这个多少个,3412吧,Flow的形式在32位抽气中是是是四个大小吧,这几个一个看加起来结果为多少,来算一下同学啊来。
05:03
十二十二。这算不出来嘛,来我自己算吧,二十五十二是不是啊,52是不是52大小,但是显示的结果是52吗?我们看一下啊,你看这这很不方便一点,就是我需要改这个,改这个里面东西就改不了。是零二,把这个先放在这吧,不影响不影我感觉不影响啊,只是我给它缩小一点就行了,那这样一讲是不是就可以了?好,那我们看一下这个什么,这个零三结构体里面我们做了一个操作什么,定义了一个结构体,然后定义一个结构体变量名称,然后打印一下结构体大小,看一下结果为多少,调试开始执行,答的结果是56,同学说是不是我算错了,是不是再算一遍,看一下咱们算的对不对啊,二十四十五十二,然后加一。还是52是不是,但是为什么显示是56呢?这里面注意一个问题,什么问题啊,是这个是内存对齐的问题,是结构体需要根据数据类型进型内存对齐,这句话先记住啊,是呃,结构体需要根据数据类型,什么数据类型,这是差类型,这是无法应对类型,这是差类型,这是float类型,这是差类型是不是啊,它需要根据个数数据类型对对一个叫什么呀?叫内存对齐,那给大家画一下它的格式什么样的啊,先给大家那个拿图画一下啊,这先保存一下,叫复合类型。
06:40
零一叫内存,呃,是复合类型,好,我们这里面新建一个啊,那正常情况我们先画一下是什么,画一下这个内存的一个模型图啊,这是第一排,假如说这是一个什么一个这个是。差类一个差类型,差类型的20大小啊是第一个是差,然后是name为多少啊20它假如存在这啊,那这里面它会找到这个最大的数据类型,看一下这里面最大数据类型什么数据类型in的float吧,是不是都是四个啊,它就会按照什么去隔,按照这个是它最大数类型去,比如这里面是呃,Int类型,那这里面几个隔是隔成五个吧,是不是啊,这隔成五个,看一下是一个,这是一个int类型大小,再来一程大小两个。
07:33
三个四个是五个吧,假如这个这是一样大小的啊,是都代表一个液大小,这里面这五个加起来,我把这先切出来啊,这五个加起来是不是才能存一个什么呀?一个这个是差类型的一个name这一个值啊是不是它一个数组啊占了几个,占了五个异射类型大小了是不是,然后呢,然后下面是个什么,下面是一个呃,无符号的认证类型,它占几个,它是不是占一个啊。
08:02
它占一个占多大是从这到这儿啊,占了这个一个大小,这个是UNI,然后是int类型,这个大小放在这。然后下一个什么,下一个是这个是差,然后是套为15,那这里面看一下四个一格,四个一格能隔出几个了,这是一四,然后是。呃,二四得八三四一十二四四一十六是不是他应该占几个,应该是占了,占了到这位置是不是还留一个啊,留一个作为什么位置,留一个做那个是一个字符大小,是不是这一个差类型的TL,这是一个15个大小,这里面剩几个一个是不是剩一个啊,这里面注意一下这是一个啊。一个,那下一个是什么类型,下一个是flow的类型,Flow类型大小情况,它得怎么对齐了是不是啊,这一个能放一个flow类型吗?放不了,所以说这里面它得怎么着,再再单独再画一个什么,再画个线去存什么flow就行。
09:09
嗯,然后这里面存几个,存三个吧,啊一个,然后是两个,然后是三个,这个是一个float类型的一个值。零的数组float是scores为三的一个数组,从完之后,那这里面是不是这个,这个还还剩下大小啊,看一下这里面剩多少,剩一个是不是啊,一个他把这一个怎么着,一个也给他拿过来,拿哪去啊,拿到这个是这块来。这个里面放的什么,放的是这个是呃,差类型的什么呀,差类型的。
10:00
性别吧,嗯,性别,但是剩下这块内存区域,它这里面剩几个,是不是剩三个三个啊,剩剩下三个,剩三个情况下,这个他也怎么的,也系统也不会给它继续往这里面赋值了,而是把这个这一块。就我切下来这一块,看做一个什么,一个整体去看待,那看这里面多少个是,这里面横向是一四二四三四四四五四四五二十是不是,然后这里面几个123加起来多少个,再加上这这两个加起来是多少,多少个是不是这个是呃是不是56啊啊能算出来吗?123,这是三个横向是123。五吧,几个123455乘三个15,再乘以个四呢?怎么怎么是60个呢,我我我我看一下是不是哪块占错了第三行,第三行只有四个啊sorry sorry sorry。
11:12
Sorry扰啊,这这块这块这个这个怎么的这块弄错了啊,这个是怎么的,是到这才怎么的才才才他结尾了吧,是不是啊到这结尾了,这个刚才说错了,抱好意思啊,抱歉抱歉。从这为结尾是不是,那这里面这块是几个,这块是一个这个差类型大小吧,呃,一个差类型的S大小,这里面剩了几个,这块剩的是不是这个是呃三个呀,三个到这为结尾了,那下面是不是这个还四个,它是不是可以给别人去用啊,它到它它它大小是怎么个大小,是不是这块大小啊到这然后再去掉哪个空格大小,是不是这块空格大小啊,它占大小就是占了。就是这么大块,那个先把这些不要了啊,这些不要了,他在我们内存中占的是不是这么大小啊,是不是这个是三呃三呃,五乘三是15,再乘以个四多少啊,六十六十再减去一个这个空股大小是多少?是56个吧啊是56个大小啊,那这里面它的起始下标看一下,这里面起始下标一定是一个四的倍数,注意一下啊是。
12:18
我把这话是给大家写个注意啊,注意是什么是。嗯。所有数据类型的大小。在内存中存储的地址以。一定是。呃,是它的类型的倍数,能明白这话意思吗?我把这个标红一下,再说一遍,所有数据类型的大小,在内存中存储的地址一定是它类型的倍数,比如说是整形的情况下,它的它一定是什么四的倍数吧?啊是不是这样,那是比如说double类型,它在内存存的一定是什么,一定是八的倍数,那是差类型呢,一的倍数,那这里面随便存了是不是,但只要是什么,只要是这个高位点数据类型,它在那时存的都一定是什么,一定是这个是它高位的数据类型,所以说这里面它起始的地址一定是谁的倍数啊,一定是四的倍数吧,到结尾它也一定是什么,一定是一个。
13:25
四的倍数,所以说这里面会省这块会有三个,这块会有一个,所以会出现这种结果,知道吧,就是产生了什么,产生了空余,那我们这里面可以怎么可以把这个里面去优化一下,然后就让它不产生空余,怎么去优化呢?看一下这个格式啊。拿过来这里面多少个,这里面是15个吧,是不是空余几个,空余一个吧,我正好把这个差塞进去之后能剩几个,是不是满了,满了这里面再显示这个指数发生变化了,我们再调试看一下,调试开始执行九几大小是52了吧,啊,你拿下来啊,拿下来变成多少吧。
14:02
就是开始执行。56啊啊,存储同样的数据,那你说是用52个还是用56啊,52个是不是更节省内存一点啊,所以说你在写结构体的情况,建议怎么呢?建议这个是按照数据类型从大到下这样去写是什么样的,我再给大家举个例子啊,再给大家举个例子啊,把这结构体先给它注销掉啊,再来个例子。再来例子啊。好,同样叫TOTO。好,这样写啊,先写个什么,先写一个,呃。星。然后是。P,这是第一个,然后是。唱,哎呀。二然后是int类型的C。
15:03
还有是。Short类型的D,然后还有是duw型的F,以及这个是long类型的。ABCDEFG,然后还有一个是。Float类型的。H是一个数组,是两个大小,那你告诉我现在这个大小多大,能算出来吗?啊,这里面占几个是四个值,这个呢两个,这个呢四个,那这个占几个啊是两个吧,呃,这个呢,Double包八个,然后这个占几个四个,这占几个八个吧?啊那找这里面最大数据类型是哪个类型,是double类型,是不是所有的格式都得按照double这里面对齐了是不是啊这里面四个加这俩,这变成几个了,六个,其实它应该是八个,能明白吗?因为空余的剩几个,空余是两个是不是两个能存下这个这个值吗?是不是存不下啊啊然后再加这四个呢?是这个是12了吧,12再加这个是多少?再这俩加来是不是也是也是八,也是八个大小啊啊这八十八变成多少个,十六十六情况下,这里面是是多少个,是24个,那这里面再加四个呢?28个是不是28个情况下,这里面这个剩余的这。
16:35
能放下一个FLOAT10吗?能不能放下,能放下这里面可以放下这里面这两类数型是不是一样的,四加四是不是等于八呀,然后这里面这个它这里面剩下几个,剩下是半个了吧,但后半个那四个是不是也得怎么的也得是拿过来去,这个这个被空占用了吧?啊这里面这正常下下来应该加多少个。24加16应该多少?呃,是40吧,应该是啊40看结果,呃是最后的结果是不是40啊,看一下结果是不是40,诶我在在下一行写啊,是不是40,打印一下啊,调试开始执行。
17:17
然后接下来呢,我会把这两句话。是不是大小为40啊啊,不是36,我给大家画一下这个就是现在这个值的一个内存的一个分布图啊啊,这个先保存一下是结构体内存零二叫结构体内存。存储结构再给大家来一个,呃,再用我们这个值来一个,把这个代码粘贴过来啊,然后我们去操作一下,首先是什么是这个是它大小按几按几为单位了,按八位单位了吧,啊按八位单位啊,这个手地址已经是八的这个这个地址是不是结束也对应的是一个八结束的位置是不是啊,那我们这里面画大一点啊,画大一点不用担心啊。
18:08
这里面每个每个单位代表八个什么呀,八个这个呃字节大小啊八个字大小,首先这里面第一个什么,这里面是呃大类型的P占几个呃占了这个是呃一半大小,然后后面是一个数组占几个两个啊占两个,然后哪个这个是不是为空了啊,这块区域为空,那我用红色给表示一啊,这个区域是不是为空了,为空,为啥为空呢?因为这个in的类型从这占不了,是不是得往下来占几个占了是。四个大小这是什么?这是我们印的C了吧,然后是少类型的,这个D占几个,两个啊,两个之后剩下的是不是又为空了啊,又为空这块用红,呃是等会啊,是黑色,然后这块用什么?用这个红色来表示它的。空。啊,这块空几个,是不是空两个,这块是不是也空两个,然后这里面是什么,一个是double double是占整个这一个啊整个这个一个,然后是浪占几个,浪占了是浪占了几个是四个值吧啊哎哎呀哎呀,我就不信了,是不是来占了这个体值,是不是这个色置啊,那flow类型是不是这个这个能也是不是能占下这是什么,这是这个是O吧,这个都行啊这个是叫什么,这个差差星这是类型,然后这什么这是。
19:35
呃,差立型的数组占两个,这是什么?这是in,这是什么,这是short,然后这是什么,这是double door占了整个这一个,然后这什么这是long啊,这是不是可以可以被这个谁呀?可以被这个flow使用嘛,是不是啊,Flow类型来使用只是一一半是不是,这块是不是还得占一半啊啊,这块是不是还得占一半啊。
20:00
占了几个,是不是占了四个吧啊float类型,Float类型这四个是不是得也得也得怎么样也得空下来吧啊也得空下来,空下来做什么操作,是留着是备用嘛,是不是对应这个就是起始的这个位置和这个终点的位置一定是个什么呀,一定是一个八的倍数,为什么?因为这里面最大类型是哪个是这个是double啊,Double对应的一定要对应到这里面来啊,那我下这里面空余了几个。两个,这是两个空余,两个这是空余了啊两个这空余几个啊,这是这是四个啊四个总共空余了几个,空余了八个是不是,那我们只需要怎么的给他这个是前后数据颠倒一下,因为这里面前后这个结构体里面这个前后数据颠倒不影响我们这个程序运行,是不是也不影响我们结果啊啊那我看一下怎么去颠倒能更合适一点呢?把这个shot挪到这里是不是可以啊啊把这shot往前挪一个,挪到什么,挪到in的之前挪这就这句话,怎么他俩换下位置是不行啊,然后这里面空余几个了啊四个,那四个情况下把这什么把这个long挪这来是不是啊,挪到double之前是不是可以啊啊然后这个呢,这个是float就可以不用变了吧?啊,那我看一下这里面能不能省这个位置啊,把这个short挪到什么呀?挪到这个是in的之前,把这个long挪到这个是double之前是不是可以啊?啊,那我看一下这个结果调试开始执行。
21:26
32是不是省了八个,这样情况下是不是会比那个什么,会比我们这个是刚才写的这个代码要优一点啊,至少节省八个内存是不是大小啊啊,一个是大玻璃型的大小,那比如说这里面有1万个数组是1万个,1万个这个结构体大小,是不是能节省空间,是不是更大一点啊,这块这块这个这个明白了吗?啊,但是我们正常写的情况下,应该用另外一种格式去写,能把这个再复制一下啊,这样是我们怎么样是查完之后找到它的空余位置给它找了是不是啊,那正常情况应该这么写啊,怎么去写呢?Double放在最上面,然后是哪个,然后是。
22:01
啊,这里面他们这个都是一样级别的吧,Float,然后还有什么,还有这个是呃,Long还有什么,还有这个是啊印的他们这三个级别是一样的是不是,然后是哪个,然后是这个是shot,然后是呃不是这这个这个差青跟他们也一样的吧,跟谁一样,跟上面一样的吧,啊那这样情况下,这个从上从上到下,把这个是排列起来,我们看下值会不会发生变化啊把这先注销掉。会不会发生变化啊,看一下这值调试开始执行是不是还是32,所以说一般情况下我们结构体去排列什么呀,排列这个它的位置的时候,是从数据类型从上到下顺序排列就行了,就我们不用怎么的插空去插了吧,啊不用插空的情况下,是不是这样就怎么着,更那个方便一点了吧啊你不需要管这些东西啊,那一般情况结构题这里面,比如说这个正常情况下,你在以后工作情况下可以做什么操作啊,比如说呃,写游戏是不是可以啊,那写游戏里面用结构题显示什么,显示人物信息是不是等级啊,什么什么这个姓名啊,什么什么装备属性啊,什么全给以在这里面显示啊,那这里面显示的时候你就怎么着,就不需要再去给他这个是这个找它对应的这个值了,是不是按照从上到到下给他一对齐就完事了,这样情况下能最大的节省空间是不是,但是这样的去写完之后不利于阅读,知道吧,那比如说正常情况下,我我在工作中要写是写哪种格式呢?这种格式。
23:23
首先是呃,比如说从游戏角度讲,是这个叫什么,就叫姓名,然后是呃等等级,等级,然后是呃是当前经验,比如说你现在十级是不是当前经验,是不是有一个呃当前经验啊,然后是啊是不是属性是呃什么这个呃力力量是不是啊力量啊攻击啊行攻击也行,攻击,然后是防御,呃防御防御,然后还有什么,还有是呃你换两个不同类型,你要相同类型鞋有啥意思啊,是不是什么智商跟智商什么关系啊,生命值呃这这不是你要你要换成不同类型啊,我只是让你看一下这个结构有不同类型,比如说这个是呃技能呃技能这个呃冷却是不是就是技能CD是不是也叫冷却,冷却啊,冷却是不是1万。
24:23
这你你当把这些写完之后,是不是我看起来是不是很舒服啊,但是比如说姓名我用什么用这个是呃差类型数组CHR,然后是name,这里面这个名字游戏叫什么200是不是可以啊,假如是200啊等级那用什么类型是int类型或无法in特型是不是可以啊,当前经验那个是用什么类型,Int类型,这个是不是也用认特类型。In的类型,这里面用什么用这个lo类型是不是精冷却啊,什么0.35秒是不是也得也得计算啊,所以说这里面当当你写成不同数据类型情况下,呃,虽然说在内存中存的这个怎么着,大小可能是大一点,但是怎么是不是方便阅读啊,你读起来是不是很很明白啊,比如说第一个要这个设置等级,设置姓名,第二设置等级,第三设置经验,那你要这种情况下,第一个设置W型的这个是什么什么在找看起来是不是不舒服啊,你要当当你节省空间的时候,你可能面临另外一个问题,就什么问题啊,就是不利于阅读,当你利阅读的时候就不利于什么,不利于节省空间,所以这两个最好你找一个什么权重知道吧,什么叫权重?应该明白啥意思吧,就是它俩的平衡点啊,这样既方便阅读,又方便什么,又方便你的去。
25:32
呃,去节省存储空间啊,啊,这是你以后工作中注意的这个问题啊,那把这块保存一下,这是我们讲的什么,讲的是结构体的这个大小,以及结构体的这个是存储的这个格式跟存储格式。
我来说两句