精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

編譯器的自動(dòng)內(nèi)存管理,靜態(tài)的GC算法

開(kāi)發(fā) 前端
寫(xiě)過(guò)C語(yǔ)言的都知道,多線程的野指針是非常難查的BUG,因?yàn)槌绦蚺茱w了不知道會(huì)core在哪里,而且BUG也不是必現(xiàn)的。

?C語(yǔ)言幾乎唯一的缺點(diǎn)就是,需要手動(dòng)管理內(nèi)存。

拋開(kāi)這點(diǎn)之外,我覺(jué)得其他語(yǔ)言都不如C語(yǔ)言?。

所以,雖然自動(dòng)內(nèi)存管理比較復(fù)雜,但我還是給scf編譯器框架加了靜態(tài)的GC算法。

在編程方面,自動(dòng)內(nèi)存管理一般叫GC算法,是英文Garbage Collection的縮寫(xiě)。

棧內(nèi)存的管理比較簡(jiǎn)單,是由編譯器根據(jù)函數(shù)調(diào)用鏈而自動(dòng)管理的。

堆內(nèi)存的管理,在C語(yǔ)言里是由程序員手動(dòng)管理的。

因?yàn)槌绦騿T管理錯(cuò)了堆內(nèi)存而導(dǎo)致的BUG,是C語(yǔ)言最常見(jiàn)、也最難搞的BUG。

所以,后來(lái)的編程語(yǔ)言都對(duì)內(nèi)存管理做了簡(jiǎn)化,例如C++的智能指針。

C++的智能指針,是一種半自動(dòng)的內(nèi)存管理機(jī)制:

它把一個(gè)堆內(nèi)存的指針?lè)旁谝粋€(gè)類(lèi)的成員變量里,利用局部對(duì)象離開(kāi)作用域時(shí)的析構(gòu)函數(shù),來(lái)完成堆內(nèi)存的釋放。

所以C++的效率比其他語(yǔ)言快得多,因?yàn)榫植繉?duì)象什么時(shí)候離開(kāi)作用域,是可以在編譯時(shí)就確定的,不需要在運(yùn)行時(shí)做額外的處理。

也就是說(shuō),C++的智能指針是靜態(tài)的GC算法。

在編譯時(shí)就處理好的算法,是靜態(tài)的算法。

在運(yùn)行時(shí)才會(huì)處理的算法,是動(dòng)態(tài)的算法。

動(dòng)態(tài)的算法依賴(lài)于運(yùn)行時(shí)狀態(tài),對(duì)程序的速度有較大的影響:

  • 因?yàn)榭蚣茉谔幚韺?duì)象內(nèi)存的回收時(shí),用戶(hù)程序不得不暫停,
  • 否則兩邊發(fā)生競(jìng)爭(zhēng)條件,那就是跟C語(yǔ)言的野指針一樣的BUG。

寫(xiě)過(guò)C語(yǔ)言的都知道,多線程的野指針是非常難查的BUG,因?yàn)槌绦蚺茱w了不知道會(huì)core在哪里,而且BUG也不是必現(xiàn)的。

為什么程序員怕有主控軟件的交通工具?

因?yàn)槌绦騿T知道多線程+競(jìng)爭(zhēng)條件+野指針 == 隨機(jī)crash + 事后找不到第一現(xiàn)場(chǎng)?

動(dòng)態(tài)的GC算法,為了避免出現(xiàn)第2種情況,那就只能使用第1種情況。

1、GC算法有必要是動(dòng)態(tài)的嗎?

實(shí)際上沒(méi)必要,否則C語(yǔ)言怎么手動(dòng)管理內(nèi)存的。

C語(yǔ)言的free()代碼肯定是在編譯之前就寫(xiě)好了的!

只要寫(xiě)對(duì)了free()位置,C語(yǔ)言既不會(huì)出BUG,也不會(huì)內(nèi)存泄漏。

所以,編譯器只要代替程序員添加free(),就可以自動(dòng)管理內(nèi)存了。

free()的添加位置,當(dāng)然是在變量離開(kāi)作用域時(shí)。

如上圖:

有4個(gè)對(duì)象變量m0, m1, m2, m3,

main()函數(shù)返回時(shí)也是它們離開(kāi)作用域的時(shí)候,所以在main函數(shù)的結(jié)尾自動(dòng)添加釋放代碼,程序員就不用手動(dòng)釋放內(nèi)存了。

2、怎么檢測(cè)變量什么時(shí)候離開(kāi)作用域?

在編譯器的后端:

1)代碼的每個(gè)基本塊都是流程圖上的一個(gè)節(jié)點(diǎn),

2)基本塊之間通過(guò)跳轉(zhuǎn)聯(lián)系起來(lái),

3)基本塊內(nèi)部的代碼是順序運(yùn)行的。

所以,釋放內(nèi)存的代碼需要加在兩個(gè)基本塊之間。

上述main()函數(shù)的流程圖

上圖是前面的main()函數(shù)的流程圖。

創(chuàng)建一個(gè)對(duì)象分兩步:第一步調(diào)用malloc()申請(qǐng)內(nèi)存,第二步調(diào)用構(gòu)造函數(shù)__init()初始化內(nèi)存。

(為了簡(jiǎn)化代碼,我沒(méi)有做返回值為NULL的檢查)

在第8個(gè)基本塊 m3 = m0 + m1 + m2 之后,m0, m1, m2 就不再使用了,也就是它們3個(gè)離開(kāi)作用域了。

即使在源代碼層面這時(shí)m0, m1, m2依然處于main()函數(shù)的作用域內(nèi),但對(duì)后端來(lái)說(shuō)它們已經(jīng)離開(kāi)作用域了,因?yàn)橹蟮幕緣K都不再使用它們了。

所以,對(duì)m0, m1, m2的釋放代碼,應(yīng)該加在第8和第9號(hào)基本塊之間。

第9號(hào)基本塊會(huì)把指針 m3->data 賦值給dd,這會(huì)讓?zhuān)╩3->data)內(nèi)存的引用計(jì)數(shù)+1。

對(duì)m3的釋放代碼可以放在第9和第10之間,之后不會(huì)再使用m3了:這會(huì)讓m3->data的引用計(jì)數(shù)-1。

這時(shí),內(nèi)存數(shù)據(jù)有且只有1個(gè)引用計(jì)數(shù)(一開(kāi)始自帶1個(gè)),同時(shí)有且只有指針dd指向它。

指針dd的釋放在for循環(huán)之后,即第10和11之間:這里的釋放會(huì)讓引用計(jì)數(shù)減少到0。

在引用計(jì)數(shù)為0時(shí),要調(diào)用free()函數(shù),把內(nèi)存還給系統(tǒng)。

GC算法的要點(diǎn)有3個(gè):

1)什么時(shí)間調(diào)用的malloc(),

2)什么時(shí)間有指針的賦值,要把引用計(jì)數(shù)+1,

3)什么時(shí)間離開(kāi)作用域,也就是后續(xù)不再使用對(duì)象變量,要把引用計(jì)數(shù)-1,如果減少之后為0,就調(diào)用free().

3、跨函數(shù)的指針?lè)治觯?/h4>

有時(shí)候,申請(qǐng)的內(nèi)存并不會(huì)在當(dāng)前函數(shù)內(nèi)釋放,而是返回給更上層的主調(diào)函數(shù)。

這時(shí)的GC算法,就需要跨越函數(shù)的調(diào)用鏈,進(jìn)行指針?lè)治觥?/p>

mat類(lèi)的構(gòu)造函數(shù)__init()

前面的mat對(duì)象的成員指針 m3->data,就是需要跨函數(shù)分析的指針。

它是在構(gòu)造函數(shù)里申請(qǐng)的內(nèi)存,因?yàn)槭浅蓡T變量,所以要在析構(gòu)函數(shù)里釋放。

如果是局部變量,就在當(dāng)前函數(shù)內(nèi)釋放:因?yàn)榫植孔兞康淖饔糜蚓褪钱?dāng)前函數(shù)。

mat類(lèi)的聲明,成員變量部分

成員變量的有效時(shí)間,是伴隨著當(dāng)前對(duì)象的。

局部變量的有效時(shí)間,是伴隨著當(dāng)前函數(shù)的。

成員變量在構(gòu)造函數(shù)返回時(shí)依然有效,所以要把它是malloc()申請(qǐng)的這個(gè)信息,傳遞到更上層的函數(shù)。

這樣:

1)在main()里才知道它是malloc()申請(qǐng)的,

2)在 dd = m3->data 時(shí)才知道給它指向的內(nèi)存引用計(jì)數(shù)+1,

3)在釋放m3時(shí),析構(gòu)函數(shù)把引用計(jì)數(shù)-1之后,引用計(jì)數(shù)才不為0:內(nèi)存依然是有效的,這時(shí)指針dd依然指向它。

否則,dd就是野指針了!

mat類(lèi)的析構(gòu)函數(shù)__release()

函數(shù)調(diào)用鏈,在語(yǔ)義分析時(shí)是很容易確定的。

抽象語(yǔ)法樹(shù)AST上的每一個(gè)函數(shù)調(diào)用,必然有一個(gè)主調(diào)函數(shù)、有一個(gè)被調(diào)函數(shù)。

主調(diào)和被調(diào),構(gòu)成了整個(gè)程序的函數(shù)調(diào)用圖:

最頂層的是main()函數(shù),最底層的是malloc()函數(shù)。

以malloc為起點(diǎn)、main為終點(diǎn),做圖的寬度優(yōu)先搜索,就可以獲取整個(gè)調(diào)用鏈。

然后從離malloc最近的函數(shù)開(kāi)始,一層層的分析就行了。

函數(shù)調(diào)用圖

一定是用圖的寬度優(yōu)先搜索(BFS)!

不能用深度優(yōu)先搜索(DFS),因?yàn)橐粋€(gè)上層函數(shù)可能調(diào)用多個(gè)下層函數(shù),而這多個(gè)下層函數(shù)里都malloc了內(nèi)存。

如上圖:

如果是DFS,分析順序是A->D,這樣D調(diào)用B而申請(qǐng)的內(nèi)存就會(huì)被漏過(guò)去了。

如果是BFS,分析順序是A->B->C->D->E,這樣任何函數(shù)申請(qǐng)的內(nèi)存如果傳遞給上層,(在分析上層函數(shù)時(shí))都不會(huì)被漏過(guò)去。

4、遞歸調(diào)用的指針?lè)治?/h4>

上圖的C()和E()之間的互相調(diào)用構(gòu)成遞歸,表現(xiàn)為函數(shù)調(diào)用圖上的回路。

這種情況下,兩個(gè)函數(shù)里申請(qǐng)的內(nèi)存會(huì)互相傳遞,屬于最復(fù)雜的一種情況!

在編譯器里的處理方法是:

do {
delivery = check_delivery();
} while (0 == delivery);

用do while循環(huán)檢查內(nèi)存的傳遞情況,記錄傳遞的變量和計(jì)數(shù),直到不再發(fā)生變化為止。

最后,就是在合適的位置添加free()代碼了:

最后的總是最簡(jiǎn)單的,the last is the simplest.

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2010-02-02 17:08:26

Python靜態(tài)編譯器

2010-02-02 17:08:26

Python靜態(tài)編譯器

2019-12-10 08:59:55

JVM內(nèi)存算法

2010-10-20 13:43:37

C++編譯器

2010-03-23 11:17:16

Python 動(dòng)態(tài)編譯

2022-05-18 09:31:42

編譯器開(kāi)源代碼生成

2010-01-12 16:42:59

C++編譯器

2025-10-10 02:55:00

2025-10-11 08:09:12

2010-01-14 16:46:13

CentOS Mysq

2016-11-08 18:53:08

編譯器

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2020-01-10 18:04:01

Python編程語(yǔ)言Windows

2017-03-20 18:01:55

編譯器匯編

2009-08-10 17:12:54

C#編譯器

2013-03-29 10:02:37

編譯器語(yǔ)言編譯開(kāi)發(fā)

2022-05-27 08:01:36

JVM內(nèi)存收集器

2013-10-31 10:44:54

IDE工具

2012-04-05 09:13:17

C代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本久久精品电影| 中文字幕人妻一区二区三区视频| 国产精品综合在线| 久久久免费毛片| 蜜桃视频在线一区| 亚洲精品短视频| www.69av| 97人妻精品一区二区三区视频| 亚欧美无遮挡hd高清在线视频| 精品女厕一区二区三区| 成人黄色片网站| 亚洲高潮女人毛茸茸| 91av亚洲| www激情久久| 久久久亚洲精品视频| 国产精品自在自线| av在线之家电影网站| 日韩成人av在线资源| 一卡二卡欧美日韩| 99国产在线| 欧美日韩在线观看免费| 成人豆花视频| 亚洲丝袜制服诱惑| 成人国内精品久久久久一区| 国产系列精品av| 成人性生交大片免费看96| 一区二区三区在线视频观看 | 麻豆一区二区在线| 亚洲人a成www在线影院| 国产精品99久久免费黑人人妻| 天堂资源中文在线| 国产精品久久久久久模特| 日韩电影大片中文字幕| 日本免费一级视频| 成人影视在线播放| av亚洲精华国产精华精华| 91av福利视频| 少妇av片在线观看| 96视频在线观看欧美| 一区二区视频在线看| 涩涩日韩在线| 999免费视频| 欧美特黄a级高清免费大片a级| 精品日韩一区二区| 男人靠女人免费视频网站| 国产主播福利在线| 精品写真视频在线观看| 欧美激情免费看| 一区二区三区免费在线观看视频| 97成人资源| 亚洲sss视频在线视频| 玛丽玛丽电影原版免费观看1977| 中文字幕一区二区三区四区欧美| 日韩精品中文字幕第1页| 91精品国产综合久久久蜜臀图片 | 少妇大叫太粗太大爽一区二区| 91精品产国品一二三产区| 亚州成人在线电影| 免费观看国产精品视频| 国产精品天堂| 国产精品一卡二卡| 欧美在线一区二区三区四| 日本不卡一二区| 国产成人在线中文字幕| 色综合天天综合网天天狠天天| 亚洲最大免费| 色婷婷视频在线| 免费在线看成人av| 国产精品入口日韩视频大尺度| 色在线观看视频| 国精品一区二区三区| 国产亚洲欧美日韩美女| 国产清纯白嫩初高中在线观看性色| 自由日本语热亚洲人| 色婷婷综合久久久久中文| 天天色综合天天色| 欧美xxxhd| 亚洲男人电影天堂| 日本不卡高清视频一区| 免费观看国产视频| 国内精品写真在线观看| 亚洲a成v人在线观看| 高潮毛片又色又爽免费| 国内自拍一区| 欧美性视频网站| 极品盗摄国产盗摄合集| 亚洲成人资源| 久热在线中文字幕色999舞| 精品人妻无码一区二区三区 | 欧美日韩在线电影| ww国产内射精品后入国产| 国产在线更新| 国产欧美精品国产国产专区| 国内精品视频免费| 国产成人精品a视频| 免费成人在线网站| 99电影在线观看| 飘雪影视在线观看免费观看| 国产成人免费在线| 91精品久久久久久久久久| 午夜精品久久久久久久蜜桃| 精品在线观看免费| 国产精品欧美日韩一区二区| 国产精品视频第一页| 国产69精品久久99不卡| 7777奇米亚洲综合久久 | 亚洲在线视频| 欧美日韩成人在线观看| 内射一区二区三区| 91日韩免费| 久久精品视频在线观看| 貂蝉被到爽流白浆在线观看| 国产欧美日韩精品一区二区三区 | 水中色av综合| 一区二区在线观看免费| 婷婷六月天在线| 欧美顶级毛片在线播放| 精品国精品国产| 色屁屁草草影院ccyy.com| 1024成人| 日本不卡视频在线播放| 99精品视频在线播放免费| 久久久一区二区三区| 日本亚洲自拍| 日韩激情电影| 精品国产凹凸成av人网站| 91丝袜超薄交口足| 国产激情欧美| 欧美一区二区三区思思人| 亚洲AV成人精品| 精品三级av在线导航| 久久中文字幕视频| 夜夜躁很很躁日日躁麻豆| 国精品**一区二区三区在线蜜桃| 人偷久久久久久久偷女厕| 成人免费网站观看| 91福利小视频| 97超碰在线免费观看| 在线观看一区视频| 国产精品免费看一区二区三区| 污视频在线免费| 久久久亚洲欧洲日产国码αv| 国内少妇毛片视频| 成人欧美大片| 亚洲国产欧美一区二区三区同亚洲| 91杏吧porn蝌蚪| 亚洲高清电影| 国产精品美女xx| 国产蜜臀av在线播放| 精品日本高清在线播放| 亚洲精品女人久久久| jvid福利在线一区二区| 超碰精品一区二区三区乱码| 91禁在线观看| 91日韩一区二区三区| 婷婷五月综合缴情在线视频| 福利一区二区| 这里只有精品久久| 麻豆changesxxx国产| 久久av在线| 91视频免费在线观看| 国产精品va在线观看视色| 岛国视频午夜一区免费在线观看| 好吊色视频一区二区三区| 日韩黄色大片网站| 国产在线观看一区二区三区| 免费av在线网址| 黑人巨大精品欧美一区免费视频 | 中文字幕av在线一区二区三区| 中文字幕一区二区三区精彩视频| 美女航空一级毛片在线播放| 欧美体内谢she精2性欧美| 亚洲一级片av| 欧美一区二区三区久久精品茉莉花| 7777免费精品视频| 日本午夜在线视频| 欧洲日韩一区二区三区| 国产伦理在线观看| 亚洲另类视频| 色综合电影网| 欧美久久一区二区三区| 亚洲视频一区二区| 伊人网视频在线| 一区二区三区自拍| 国产成人精品无码片区在线| 久久午夜精品一区二区| 国产精选一区二区| 爱情电影社保片一区| 国产亚洲欧洲在线| 精品人妻午夜一区二区三区四区| 国产亚洲短视频| 亚洲一区二区三区av无码| 日韩欧国产精品一区综合无码| 亚洲男人天堂2023| 中国一级特黄毛片| 成人在线视频一区| 久久久久久久久久伊人| 祥仔av免费一区二区三区四区| 欧美日韩高清区| 国产女人在线观看| 亚洲成人黄色网址| 国产一国产二国产三| 国产成人在线色| 免费观看成人网| 国产成人精品三级高清久久91| 成人在线精品视频| 亚洲精品国产精品国产| 亚洲国产精品久久精品怡红院| 波多野结衣理论片| 亚洲一区免费观看| 91亚洲一线产区二线产区| 日韩在线一二三区| 天堂va久久久噜噜噜久久va| 一区二区三区视频免费视频观看网站 | 国产精品一区二区av交换| 电影午夜精品一区二区三区| 国产黄大片在线观看画质优化| 亚洲国模精品私拍| 精品国产区一区二| 欧美日韩高清一区| 欧美xxxooo| 国产一区在线观看麻豆| www.18av.com| 久久精品不卡| 欧美在线视频二区| 日韩啪啪网站| 国产免费一区| 澳门久久精品| 99久久精品免费看国产四区| 成人一级视频| 国产精品视频精品| 亚洲一区二区三区四区| 神马久久久久久| 国产黄色片免费| 欧美日韩一区二区在线观看 | 欧美男同性恋视频网站| 久久久久久久久毛片| 国产精品乱人伦中文| 中文字幕 日韩 欧美| 国产一区二区三区自拍| 中文字幕免费高| 国产精品超碰| av色综合网| 视频精品国内| 国产91精品久久久久| av日韩国产| 影音先锋日韩有码| 午夜精品一区二区三| 欧美丰满少妇xxxxx高潮对白| 丰满熟女人妻一区二区三| 亚洲欧洲中文日韩久久av乱码| 一级二级黄色片| 国产精品久久久久久亚洲毛片| 日本猛少妇色xxxxx免费网站| 欧美激情自拍偷拍| 国产一区二区三区视频播放| 国产女人18毛片水真多成人如厕| 手机看片福利视频| 国产精品久久久久久久久免费桃花 | 亚洲天堂最新地址| 中文字幕在线视频一区| 午夜免费激情视频| 亚洲一区电影777| 久久国产视频播放| 欧美在线free| 久久久久噜噜噜亚洲熟女综合| 国产日韩欧美综合一区| 亚洲精品国产91| 风流少妇一区二区| av网页在线观看| 久久久久久久久伊人| 欧美日韩国产黄色| 亚洲欧美另类小说| 国产无遮挡免费视频| 欧美性生交xxxxxdddd| 中文字幕久久网| 欧美va亚洲va在线观看蝴蝶网| 欧美一区二区三区激情| 亚洲精品一区中文| 亚洲免费国产视频| 欧美日韩不卡一区二区| 国产成人精品a视频| 日韩电影在线观看永久视频免费网站| 飘雪影院手机免费高清版在线观看| 中文字幕精品在线| 午夜伦理在线视频| 久久躁日日躁aaaaxxxx| jizzjizz中国精品麻豆| 国产精品99久久久久久白浆小说| а√在线天堂官网| 国产精品久久久久久久7电影| 女人高潮被爽到呻吟在线观看| 国产97在线亚洲| 亚洲色图官网| 91精品视频在线| 国产第一亚洲| 国产精品一区在线观看| 精品视频97| 全黄性性激高免费视频| 免费在线看一区| 青青草视频播放| 亚洲乱码国产乱码精品精可以看| 毛片视频网站在线观看| 91精品婷婷国产综合久久 | 中文字幕不卡av| 成人免费观看在线观看| 成人欧美一区二区三区在线湿哒哒| 欧美日韩夜夜| 日本免费成人网| 久久超碰97中文字幕| 极品粉嫩小仙女高潮喷水久久| 中文字幕一区二区三区在线播放| 黄色在线观看国产| 疯狂做受xxxx欧美肥白少妇| 91国偷自产中文字幕久久| 亚洲欧美中文日韩在线| 51精品在线| 99国产超薄肉色丝袜交足的后果| 欧美激情777| 天天天干夜夜夜操| 久久福利资源站| 国产免费看av| 天天色 色综合| 黄色污污网站在线观看| 精品国产sm最大网站| 成人影院在线观看| 国产免费久久av| 欧美片网站免费| 中文字幕人成一区| 狂野欧美一区| 国产精品毛片一区二区| 精品av在线播放| 亚洲av永久无码国产精品久久| 亚洲第一网中文字幕| 中文字幕有码在线观看| 久久久久久久久久亚洲| 1区2区在线| 国产91精品入口17c| 欧美日韩三级电影在线| 九色91porny| 91麻豆福利精品推荐| 国产精品成人久久| 欧美精品一区男女天堂| heyzo一区| 国产伦精品一区二区三区高清版 | 久久久这里只有精品视频| 欧美精品影院| 成人午夜视频免费观看| 国产激情一区二区三区| 免费麻豆国产一区二区三区四区| 91精品国产乱码| 污视频在线看网站| 99久久国产免费免费| 亚洲精品美女91| 丰满少妇在线观看资源站| 色婷婷综合中文久久一本| 风间由美一区| 国产美女扒开尿口久久久| 亚洲激情久久| 美国黄色一级视频| 欧美日韩国产综合新一区| 久草在线青青草| 91精品国产自产在线| 最新国产精品久久久| 中国极品少妇videossexhd| 日韩欧美国产高清91| av在线播放网站| 久久久精品在线观看| 国产精品3区| 国产人妻777人伦精品hd| 99久久婷婷国产综合精品| 老熟妇仑乱一区二区av| 日韩欧美在线1卡| 国产福利免费在线观看| 国产综合久久久久| 激情欧美国产欧美| 亚洲人成人无码网www国产 | 黑人乱码一区二区三区av| 欧美壮男野外gaytube| 成人在线免费观看91| 天天夜碰日日摸日日澡性色av| 91女神在线视频| 中文字幕 日韩有码| 色综合久久悠悠| 视频一区在线观看| 亚洲中文字幕无码不卡电影| 国产精品天天摸av网| 亚洲精选一区二区三区| 日韩av电影在线网| 91精品国产调教在线观看| 黄色网址在线视频| 7799精品视频| 在线看的毛片| 青青视频免费在线观看| 久久久亚洲午夜电影| 国产欧美熟妇另类久久久 | 精品国产拍在线观看| 女生影院久久| 欧美亚洲丝袜| 久久精品国产清高在天天线|