00:00
我们再会分成几个区域,因为什么,因为这几个区域呢,是不同的概念是不同的,你要的生命周期是不同的,是不是它的限制条件是不同的,因为内存的可不可取,因为内存呢,只出因为内存呢。止血啊,没有没有止血是吧,啊也是只读的,因为是可读可写的。啊,有些呢,从这个生命周期来讲的话,有些变量呢,它是程序运行期间呢,会一直存在。有些呢,不是这样的,有些呢,那个是归我们测他手动控制的,就控制它活多久,你想让他活两级,它是活两级,你想他活四级就活四级,明白吧,哎,所这样的话会有些分区,那么事实上内存你要清楚就跟上,你要理解清楚,这个内存是没有分区的。啊,这个那个分析值帮助我们了理解理解程句。啊,把这个分区呢,跨分你也知道分区有很多种化合法,我们即便是一种呢,四区的含法啊,基本上四区已经涵盖所有的这个分区方式了,那这点大还需要理解理解啊,咱俩能刚开始呢去理解这个运营分区的概念啊。
01:02
分为分析模型,那么这块呢,我把这个分成什么?分成这个,这个程序在加载到内存之前和程序代码加载到分型之后,因为吧,因为程序一旦加载到内存中,说明这程序要开始执行了。啊,那么执执行之行,执行之前和执行的时候,它这个运行模式是不一样的啊,所以说咱们就理解理解啊,理解理解,那事实上咱们写应用程序之后呢,咱们也知道什么通过通过预编译对吧?啊编译汇编电接。哎,是不是就可以把生成一个exe程序,诶,可执行程序是不是?哎,当然这个文件格式可能是互动平台不太一样,但际上我们都叫什么可执行程序是不是?那么这个可执行程序在编析完之后呢?它分了几个区域啊,在哪几个区域呢?一般情况下我们可以看得到程序里面有很多的什么叫指令的东西。你比方说你成序中写了很多什么,A加B。B减CA加加A减减等等这样一些东西,这些东西呢,比方说这个再把那个,呃,A等于十等于等十等等这些呢,都是因为什么。
02:09
这些指令啊,是不是啊,哎,都是些指令,明白了吗?把这些数据呢,放到某块那空间里面啊,各别方面图啊,啊把数这块数据从这个空间移到A这空间啊,这两个空间的知道进行预算等等这些都是一些指令。那么还有一部分数据是什么?我们定的那些变量。定那变量,那么这些电路有什么变量呢?都没人三,你想想你都定过哪些变量啊?是不是有临时变量啊,哎,还有什么变量啊,哎有静态变量是有没有啊量,哎有静态变量,有全变量是不是啊,还有是什么,你是不是在堆栈KP上了是不是啊啊等等这些段都是我们数据啊,我们把它都都占叫数据,但是呢,呃,大家注意啊,这个占呢和中呢是比较特殊的,这个程序呢,背完之后其实它没有占区和规矩的,只有什么。
03:04
这个代码区还有数据区,也就是说我这个点本太讲给你编一下大编一下意义不太大啊,我们直接看这个过程啊,就是说当我们在比如说在这个LI2上对吧?啊,写完一个程序,我们变成E这个可程程序之后呢,我通过这个size命令会出现下面的一些结果。啊,就下面这一个test data dss后t chs form内啊,你可以看到这些信息,那么这个信息啊,通过这个size,我们看到这个文件里面内部的一个分区啊,这个分区怎么样呢?啊,其中呢,咱先不说后边一个非常简单,十进制AS16进制嘛,是不是啊,这是数这个文件的大小啊,没大小。那么前面会有什么?有个test,还有什么贝塔BSS?它要分这两个区啊,应该叫什么三个区对吧?实际上我们称为两个区,那么这个PA叫什么叫代码区,代码区什么叫代码区呢?里面放的就是程序运行过程中这行的些指令,就刚才我说那什么A加B啊,把十放到那个空间里面,AA等于十啊等等类似的这些指令,运算指令或赋值的一些指令,那么哎,这样么代码啊,指令区域,它呢,是把这个区域呢,哎放到代码去,那为什么要分区呢?一会给大家说为什么分区,分区有好处。
04:18
啊,那么还有一点呢,就是说你咱们在这个程序运过程中呢,会把这些什么全局变量啊,静态变量啊,也单纯的给它分配内存,为什么?大家想想为什么在运行之前,我就可以给全局变量,静态变量给量分配内存。大家能不能想这个问题啊?那么你像这个咱们一般说全局变量,静电变量,在整个程序之间是不是都会存在,它不会自动销毁的,它也不会知道的,程序结束它也会销毁,所以说呢,我在运行之前就可以把把这个内对咱确定好去好之呢,你就直接给你就日行线直接用就完事了。我还需要在运营,运营的时候再给分的内存吗?是不需要,我可以提前把基本准作做结好,是不是啊啊提前把这个准备工作做好,那有的时候我就是不相当于省事了嘛。
05:04
是不是啊,那为什么站和堆这个里面没有呢。这样的量就我们说的临时变量,为什么没有呢?再想你说这个变量是不是在从运行运行过程中才有啊,运行到这之后是不是产生需要的变量,我是应的变量,然后运用,用完之后呢,直接销毁了,是不是这样的,所以说像这种变量是什么在临时变量啊,还什么堆的变量呢,它都是在哪啊。在运营的时候,它有。明白吗?A生到运行者说你的程序我们实在是变成这个可程程序,这个可存程序,当你去执行它的时候,这个程序就会加载到运算里。这个程序我就漏到力分员啊,加进去之后呢,他开始执行,那这个时候呢,他他会有什么就取消占去。这样能不能理解啊,能理解吧,哎,说大面是这样理解啊,所以说咱们简单先把这个大概念先理解啊,就是说成的运行之前呢,只有两个区,一个是大瓦区,一个是全静态区。
06:01
那么就刚才我说这个德塔和BS这个T,咱比较好理解,就是指令嘛,代码。这叫BSN是什么?就是全局变量和近态变量。那么其中的静态变量分为什么?分为全局静态变量和局部静态变量,咱们不管它是全集,不管是局部,反正只要是静态变量,活的都是什么全集。是不是一直活着,是不是啊,所以说这个时候呢啊,就为什么分贝塔和BS,其实这样的,因为咱们知道啊,就是说这个全局变量和自的变量,它有一波变量,它是没有初始化的。是不是啊,一切均变和1.ah,你的胳膊ah是不是就初始化了,那还有一个直行一的A是不是没有初始化了,它把这个初始化和未初始化这个全变量和计械变量呢?啊就分开了。啊,然后呢,他把什么这个C项里面记录的就是这个大小呢,是什么是这个全局变量,被初始化的全变量和基态变量。那B3这边是什么?十倍数始化了。倍数化,这大家能理解吧,啊理解啊,那么其中咱们其实也知道对吧,如果一个静态的全定变量,或者静像全定变量没有自动化编辑,是不是自动对达数化全变量进行变量是不是会被自动示化,是化能多少?哎,是化能零是不是啊哎,所以到现在为止,咱们只需要理解为概念,可啊,咱们再说一遍,从一个运行之前的。
07:18
只有两个区,代码区和什么数据区,数据区里边包括什么啊,初始化的和位置化的全局静态变量,全局变量和静态变量。明白了吗?啊,那为什么占变量对变量没有了啊,因为这些变量出于什么啊,运行的时候才会产生的,因为这一波大我们是没有办法预测的,你想是不是啊,你道苏的多大号啊,是没有办法预测的。啊,但是全局变量和递电变量是不一样的,这个变量会一直活着嘛,一直活的话,那我提前给你分好,那位移时候是不是就省省事了,对吧?啊,那么咱们往下看啊,那么刚才说了,说这个代码区有个特点,这个代码区是只读的。啊,这个代码区是只读的,而且这个代码区呢是供氧的,这是什么意思呢?刚才咱们是不是说代码区,代码区呢是放指令。
08:06
是不是质量,那我们大家问题,大家思考这样一个问题啊,那么两个运用程序,比如说a.exe。Ex这是一个应用程序啊,那么这个时候呢,我把这个A加exe呢,运行了,是不是要把A加ex里边文件中所有的数据输到加分则里面,是不是啊,需要加内个里面,哎,然后呢,你再用什么又运行一面A点1S执行两面。是不是又要把A加ES这个代码呀,数据啊加到内存里啊,这时候你会发现。这个2A的C运行过程中,除了数据不一样,其他都一样,代码是一样的。能能不能理解啊,你想你是不是运行了两个一样的应用程序啊。是不是两个一样应用程序,那么这两个一样应用程序是不是代码区都是一样的?程序在运营过程中,你比如说QQ,咱俩运营都是程序,程序咱俩为什么咱俩QQ不一样呢?是不是因为数据不一样啊,哎,程序运过程中也一样,程序运过程中呢,除了数据不一样之外,这吗?直令的指令都是一样的,一样是不是啊,就用到了所需要的指令是不是都一样的,哎,一样的,那这样我找一个问题吧,如果你如果比方说我这个代码去啊算什么这100个好吧,我把这个成语如果运行100个,就100个a.ES的话。
09:25
D,那么你相当于什么?所以100乘以多少,100就哪里头,那你的乘以,你就光用这个多几个乘以,它就相当于内存极大浪费,其实呢,这A加一,它不管你加有多少次,其实数据不一样,我只要数据占到内存就可以了,那么对于代码区的话,我完全共享是不是就可以了?是不是啊,共享就是大家呢,你a.A4运行的时候呢,我们都运用什么。代码就放那了,你要用到这个代码,你就什么在这找他就可以了,哎,你用它就可以了。
10:01
哎了吗,这个代码就共享明白了吗?哎,这样话是不是省内存了,哎所以说呢,它在设置个代码时涉及到什么共享的。三二他涉及到的时候,涉及到还有一个概念叫什么叫什么,这这个只读。大象为什么只图啊?呃,指令是不是都在内存位远啊,是不是,如果你说你不给他保护一下,不给他这个指读的别的用时运行期间E去该你程序上该你程序的指令去,你程序可能就直接好一点的大了。是不是这样啊,你想是不是这样啊,哎,所以说呢,三马去被设会制毒。啊,指读是不是很非常很好的保护我们这个程序在运行中呢,这个指令不会发生变化,是不是啊,因为什么,因为这个指标受到什么,受到操作系统保护了,说其他任何同学要有这种恶意的行为,发现操作你的指数区域暴一幅。我就把你的声音给当掉。哎,这受到保护,这个大家理解吗?所以说呢,这个代码区呢,它是什么,它是只读的,并且是什么共享的。
11:06
它共享的,那么这个全静代区呢,咱们就不说对吧里方法是哎,数化的全域变量和进界变量和未数数化的全变量进态变量,那么这个乘运之前,那么咱还说乘余零之后啊。是不是啊,这不这个地方有个程序指令和程序数据嘛,对吧?啊,那么咱们还说这个。这个是刚才咱们说那个啊,因为之后,因为这个咱们刚才说了有一个堆积,还有战时就有这程序,一旦加完那之后呢,堆站就有了。从此时此刻呢,这个内存分区啊,就不再是哎下来之前的两个,就变成四个,就是战法区,全区,静态区,还有什么区,堆区和战区,其中堆区放什么数据啊,是帮我们成员自己开辟自己管理的数据啊,是不是啊,我们不让他死,他就死不了。除了是吧,一个程序结束,还有一种数据什么占上了,我们是没有办法制,就临时变量我们是没有办法控制的,是不是函数结束之后呢,一般就会释放下一般函数内的一个局数变量嘛,哎,结束之后呢,还自动释放,就自动申解自动释放嘛,是不是啊哎,就多这两个数据,那么这块咱们再稍微聊一下这个战区啊。
12:20
这个地方呢,我们需要大家了解是这几个区域的生命周期啊,生命周期,那其中一个呢是战区,战区呢,咱们先说先进后出,咱先不说这个内存结构啊,先不说这个内存结构,后来我们再写和写站下,我再给大家讲一个站啊,用到再给大家讲啊,那么占确内存由编译器分配,由编译器适当。那么这个地方我还要再强调一点,咱们所说的在编译阶段分配内存,并不是真正在物理内存上给它分配内存了,而是什么?而是分为地质了。明白了吗?只是给他分配一个地址而已。并不是真正给他的那个时候分每个实时占内存就是这样的,你真正这个成序,只有真正运行的时候,它才会有真正内存。
13:07
这点你要清楚啊,咱们说分配率的分配内存,并不是说啊,你定义完了内存就有那存中,呃物移运量就已经有十么空间了,不是这样的,加载到路径之后呢,还有哎,咱们说编译的流个内存只是分配什么分配地址。二个分配地址。那么这样呢,是一种先进后出啊,编辑自动申请释放,那么存放呢,有函数的参数返回值,局部变量啊,基本上占就是这样的。啊局变量参数看什么范回值都放在站上,哎,当是这个返回值的话,咱们在讲的函数那个那个调用关这个调用这个流程的时候呢,再给大家说啊,那么所以说呢啊,实时的加载和释放就是需要的就是创建啊,不需要这个适放暂时这样的由编辑的磁码自动的管理和。申请会释放,这大能理解吧,哎,一定要理解,下面站自动申请自动释放,不需要生效,管谁都不需要管用患他自己会释当了。
14:08
然呢下来还有个堆需需要对应的这个堆需必须要理解啊,这个堆虚是咱们车本上唯一能够手动控制的,就是说在需要的时候呢申请,在不需要的时候呢,咱们需要释放,那么这个会产生一个问题,什么什么什么问题啊。啊就释放问题,因为咱们都知道需要的时候开开了,但是往往在不需要的时候不好不好关。所以这样有可能造成问题啊,内存泄漏啊,如果你写函里边每次拿了卡没有释放啊,只有一个结果,内存最终就不够用,主机啊关机啊就重启了,明白吧。所以说堆虚不管是C,不管是C加,你都要记住,凡是你在堆上开内存,你必须要自己手动知道,你自己开始追内分,你必须要手动失当,要么你就等成序结束的时候是吧,但一般情况你不知当了成序结束的时候,估计也就内存耗尽了。
15:07
是不是啊,所以说千万不要忘了啊,然后还有一点啊,还有一点就是说占的大小呢。是固定的。是一定的大小啊,这个大小呢,是啊,理论上没有上限的,哎,看着机器有多大多大利索了。啊,那么啊,就是说如果数据量比较大的话,我们一般会放到那啊,哎,放到堆上,不要放到站上,明白吗?哎,如果你放到站场,可能来一个直接来个什么that overlow这一出。啊,因为站上只放什么放参数啊,然只上放放这些数据啊,所以大量的数据比数据之后涉及到这个啊,几十万数据对吧?啊几万数据你就不要把它放在哪,不要把它放到堆上,放到把放站那放堆方那啊堆上啊放堆上放大的数据啊。那么这个呢,是需要我们增加手动数啊,这点你需要一定要要清楚啊,那么这点我还没有说一个分区,没有说哪个分区呢,没有说全员静态区,我这点不要要强调这个全静太区。
16:10
这边呢,我没有找不着了啊,找不着我不看了,然后咱们说一下这个全局近代曲。啊,对于这其实还是比较好理解的,是不是啊,自动式线自动式啊比较好理解,那么咱们在乘以加上之后呢,哎,仍然会有什么,有一个叫全局。我这一会都讲了啊,全局静态区,那一般情况下呢,我们全局静态区呢,放哪些变量呢?放三种全局变量。静态变量。静态变量放在静态区,全域变量放在全域区。明白了吗?啊,哎,然了,还有什么。哎,还有常量区上区。一般我们说的话,全局计算区包含后半这三种全局变量,听见没有和朝样,一般就是说全区有全局区,哎叫全区对吧。
17:04
全区放全局变量嘛,啊这么比较好理解对吧,静态区放静态变量,常量区放常量。那么我相信啊,这个全区其实大家比较好理解,静态大家都知道是不是啊,那么我感觉大家对于静海区还是理解不够深。大家知道近代区和全区区别是什么吗?啊,进来区就是说一个变量一个变量in的A,全局变量in的A和全局的study in的A有什么区别吗?什么区别吗?有什么区别吗?生命周期不骤是不是?哎,咱们说这俩货从从第一集一直到最后大结局都活着了。是不是都一样了,一样,那什么不一样呢?啊,应该是吧。作。由于我们一般情况下把Van in叫做什么叫做也叫什么叫内部链接的一个属性叫内部链接,然后呢,一两一点叫什么外部链接,其实我们在定1A变量的时候,我们前面才少写一个关键字。
18:15
X是不叫这个词啊,哎,少一个啊,默认情况下别析我就加X,也就是说一等A全变量默认它是。全体变量啊,就是说它是一个啊外部链接属性,什么叫外部链接属性呢?如果你这个变量是全局变量,是外部连接属性,就是说在其他文件里面,比如说你这个A呢,在a.C里面定义这,那么你在b.C里边是可以用它的。明白了吧,在整个运成全范围内,其他文量里边是可以用这个电量的,只需要先证明就可以使用,那么如果你用三电导位了,不好意思,这知道吧,这内部链接属性,内部链接属性说明这个A这个内存的。这块就是这个符号呢,只能在哪可见啊,只能在当前文件内可见,如果你这个在这用A在a.C点对应的,不好意思,b.C是不能用了。
19:05
这样能不理解啊,咱们在讲到那个下午去再给家敲这个代码的时候呢,再给大家说这个再给大家演示啊,这个外部链接没有问题,这个概念呢比要重要,那么还有一点呢,就是说你在写这个声明函数写in return in到A的时候呢,应该注意什么东西,也就是说编辑看到声明的话是什么意思,你要知道。这样能理解吧,下午咱们再讲的,再给大家讲啊,咱们先先大个零给它啊,那么下面还有一个常量曲。长上区,长区需要我们特个理解,小到数据会发到长上去。哎,字符串,哎,这个说法不太准确,这个叫什么叫字符串常量是不是咱们所说的字段上属于什么字符串,是不是这个放在双引号里边这个组上是不是这个啊,一般的情况这个东西放在那啊,放在。哎,常上去是不是放在查上去啊,哎,那么还有数据呢,也会放在常上去。
20:08
一大差距。什么数据呢?ICO的修饰的选举变量。两个数据。就是说刚才一条是不是一个区变量啊,前面加cos它也会放在常量区,那么这个常量区有什么特点呢?你要记住啊,常量区的数据。一旦初始化不能够修改,谁都修改不了,你通过指针间接修改,间接赋值也修改不了,为什么?如果我说你通过指线间线复射修改了,你应该说最高内的区域是不是受到保护啊。是不是应该是个什么。至多那个。是不是只读内存,哎,所以说你看你在写hardwork的时候,你是不是修改它里边值差星。
21:02
噪音。Hello word的时候是不是直接大秒,是不是直接大秒,为什么会大掉,因为这个how它是不是放在哪啊。吃饭插上去啊,是放插上去啊,这个插上区就是一旦触发不能修改。这家能理解吗?哎,这个具体的代码咱们下午再给大家解示啊,再给大家解释,那么意思就是说,如果这个hello word放在查上区的话,那么是不能够修改的,如果没有放在插上区,那么是可以修改的,是不是啊,那么这个咱我记得昨天给大家说的时候,还给大说一下我这个还沃能不能修改的问题,那么你记住啊,这个地方呢,咱们理论上认为它就是不能够修改的。啊,里面这个就是不能够修改的,你能明白我说啥是什么意思吗?因为我希望呢,会给大家演示,我们用另外一个编译器去编译完这个程序之后呢,我可以把这个程序的修改。就把hello word h呢给它改了,任何一个地方词库都给它改了其他的,而且还可以正确输出。
22:01
所以这个只是编译器答案,为什么举这个案例呢?就是让大家理解啊,你写程序啊,编译器不同可能会产生一些差异,但是啊,虽然不同,但是咱们会有一个什么约定。决定,也就是说咱们认为差0P点哈沃这四散就是能修改我也不会去修改,明白我是啥意思吗?啊,就这意思,所以说以后再写差星等于hello的时候呢,应该怎么写,选cost差星P等于hello,这个肯定就改不了,明白了吗?啊,这个才是什么防启发,就说你在意上,你比方说你传一个直接传个hard word进去,那么他只能给你报错,他说你必须要加上Co,你不加count,我论你两个类就不匹配,明白了吧,这家能理解吧,啊所以这点呢,它是全局近赛区啊,咱们你要重点是这个,这个全静展区还是比较好理解,重点是个长区,你要知道里边放哪些数据,看权益变量和增加常量。
23:00
都放在这个长热区,长热区特点是一旦银行里边放弃数据啊,报区就修改不了了,这些复数修改不了,因为计算这存是只读的,受到谁啊只读保护。你去不了。到下来演示啊,那么还有一个就是堆需和战序,咱们就不知道堆虚的话。自己申请,别忘了释放,哎,数据量大的话,把数据放到最上,不要放在站上。区的变量是自动升级自动时的,不要去管它。啊,你特别是你要注意这个啊,居住这样的生命周期,你用它的时候,你要保证它没有死。还活着的。是不是啊,这样上堆上了,你要保证它是用的时候。用的不用的时候应该是要释放。是不是啊,哎,咱们后边呢,从会有些更要记术下,就是为了解决这个释放问题啊,特别是自压力啊,所以大家大概大家了解了吧,下的话咱们把每个分区啊,咱们按个马连代码啊,非常清楚啊啊我来画一下这个那个分区啊,我大家。
24:05
觅食去吧。
我来说两句