Swiftはmark-sweepアルゴリズムと関連文章の推薦を実現する
2049 ワード
本論文では,主に
参考記事のおすすめゴミ回収アルゴリズム実装-タグ-クリア(完全実行可能C言語コード) babys-first-garbage-collector understanding-and-implementing-a-garbage-collector writing-a-mark-sweep-garbage-collector を強くお勧めします
ヘッダ情報定義
オブジェクト定義
≪ヒープ定義|Heap Definitions|oem_src≫:メモリ内のヒープの状態をシミュレートします.
アイドルチェーンテーブル定義:
タグフェーズ:
クリアフェーズ:
Swift
を用いてオブジェクト,ヘッダ,ドメイン,スタックおよび空きチェーンテーブルの定義をシミュレートし,タグとクリアの2段階アルゴリズムを実現して理解を助け,mark-sweep
アルゴリズムの構想を簡単に実現し,オブジェクト割り当てプロセスを含まない.完全なコードはmark-sweep.swift 参考記事のおすすめ
ヘッダ情報定義
class HeaderInfo {
var name: String
var size: Int
var marked: Bool
init(_ name: String, size: Int) {
self.name = name
self.size = size
marked = false
}
}
オブジェクト定義
class Obj {
var head: HeaderInfo //
var field: Obj? //
init(_ headInfo: HeaderInfo) {
head = headInfo
}
}
≪ヒープ定義|Heap Definitions|oem_src≫:メモリ内のヒープの状態をシミュレートします.
class Heap {
var usedSize: Int = 0
var maxSize: Int
private var _objs: [Obj] = [] //
init(_ maxSize: Int) {
self.maxSize = maxSize
}
var objs: [Obj] {
get {return _objs}
}
func appendObj(_ obj: Obj) {
usedSize += obj.head.size
_objs.append(obj)
}
}
アイドルチェーンテーブル定義:
class Node {
var next: Node?
var data: Obj?
}
タグフェーズ:
private func markPhase() {
for obj in roots {
mark(obj)
}
}
//
private func mark(_ obj: Obj) {
if obj.head.marked == false {
obj.head.marked = true
if let child = obj.field {
mark(child)
}
}
}
クリアフェーズ:
private func sweepPhase() {
for obj in heap.objs {
if obj.head.marked {
obj.head.marked = false
} else {
//
obj.head.name = "FreeChunk" //
let freeNode = Node()
freeNode.data = obj
freeNode.next = freeList
freeList = freeNode
}
}
}