lisp 標記形心 標記 整理演算法

2021-10-13 14:52:22 字數 1463 閱讀 3094

定義

該演算法分為標記和整理兩個階段,標記階段會遍歷並標記活動物件,整理階段通過數次搜尋堆來重新裝填活動物件,它們聚集到了堆的一端。

lisp2演算法

forwarding指標表示活動物件的目標位址

過程概要

初始狀態

標記結束後

整理結束後

整理階段偽**

compaction_phase() {

// 設定forwarding指標

set_forwarding_ptr();

// 更新指正

adjust_ptr();

// 移動物件

move_obj();

// 第一次遍歷堆

// $head_start 堆起始位址

// $head_end 堆結束位址

set_forwarding_ptr() {

// 定義搜尋堆的指標和指向目標位址的指標

scan = new_address = $head_start;

// 遍歷堆,進行設定

while (scan < $head_end) {

// 若是活動物件,則設定forwarding指標

if (scan.mark == true) {

scan.forwarding = new_address;

new_address += scan.size;

scan += scan.size;

// 第二次遍歷堆

adjust_ptr() {

// 更新根物件forwarding指標

for (r : $roots) {

*r = (*r).forwarding;

scan = $head_start;

while (scan < $head_end) {

// 更新子物件forwarding指標

if(scan.mark == true) {

for(child : children(scan)) {

*child = (*child).forwarding;

scan += scan.size;

// 第三次遍歷堆

move_obj() {

scan = $free = $heap_start;

while(scan < $heap_end) {

if(scan.mark == true) {

// 將找到的物件移動到 forwarding 指標的引用目標處

new_address = scan.forwarding;

copy_data(new_address, scan, scan.size);

new_address.forwarding = null;

new_address.mark = false;

$free += new_address.size;

scan += scan.size;

LISP 圓孔標記 lisp使用說明

字串結合功能函式 getstring 提示 要求鍵入乙個字串 rtos 實數 將實數轉換成字串 範例說明 1 strcat abc 123 lisp 傳回 abc123lisp.字串結合功能函式 getstring 提示 要求鍵入乙個字串 rtos 實數 將實數轉換成字串 範例說明 1 strcat...

心形函式 封心

這個是 html5實驗室 canvas世界 中的乙個例子,最大的收穫當然是心形函式 x 2 y 2 1 x 2 y 3 0。有了前面幾個動畫做鋪墊,這個還是比較容易就完成了,沒有遇到什麼奇特的問題。不過也因為比較輕鬆,的組織不是很認真,也不想去改了。值得一提的是這個動畫很容易另行發揮,我在除錯的過程...

animation心形 表白

animation心形線 表白 去除預設外邊距 內邊距 body heart3d display heart3d class rib heart3d class 0 heart3d class 1 heart3d class 2 heart3d class 3 heart3d class 4 hea...