Delphi筆記 整理 堆和棧

2021-08-29 12:37:40 字數 1167 閱讀 4075

在windows 下,乙個程式的堆疊由兩個值定義:堆疊的最小值和最大值。這兩個值受編譯器指示字

$minstacksize 和 $maxstacksize 所控制,它們的預設值分別是16,384(16k)和1,048,576

(1m)。在linux 下,堆疊大小只能由環境設定。

在register 約定下,最多有3 個引數可通過cpu 暫存器傳遞,其餘(若有的話)引數被傳遞到棧。此時,

引數以宣告的順序(和pascal 相同)被傳遞,前3 個有資格的引數分別使用eax、edx 和ecx 暫存器。

過程和函式必須保留ebx、esi、edi 和ebp 暫存器,但可以修改eax、edx 和ecx。當在組合語言

中實現構造和銷毀時,保證預留dl 暫存器。過程和函式被呼叫時,是假定cpu 的direction 標誌是清除

的(對應於cld 指令),並且返回時,direction 標誌也必須是清除的。

以下約定適用於函式的返回值:

? 可能的話,有序型別通過暫存器返回值:位元組通過al 返回,字通過ax 返回,雙字通過eax 返

回。 ? 實數型別的返回值在浮點協處理器的棧頂暫存器(top-of-stack register,st(0))。對於currency 類

型的返回值,st(0)中的值被乘以10000。比如,currency 值1.234 在st(0)中的值為12340。

? 對字串、動態陣列、方法指標、variant、或int64 型別的返回值,就像函式在其它引數的後面額

外宣告了乙個var 引數。換句話說,是函式呼叫者傳遞乙個額外的32 位指標,它指向的變數用來

返回結果。

? 指標、類、類引用和過程指標型別,結果通過eax 返回。

? 對靜態陣列、記錄和集合型別,若結果占用1 個位元組,它通過al 返回;若結果占用2 個位元組,

它通過ax 返回;若結果占用4 個位元組,它通過eax 返回。否則(結果超過4 個位元組),結果通

過乙個額外的var 引數返回,它在所有宣告的引數的後邊。

在register 呼叫約定下,self 就像在所有其它引數的前面宣告,所以,它總是通過eax 暫存器傳遞。

在pascal 呼叫約定下,self 就像在所有其它引數的後面宣告(有時還要包括返回函式值的額外的var 參

數),所以,它最後被壓入棧,所在的位址比其它引數要低。

堆和棧概念整理

1.記憶體管理方式 堆 一般由程式設計師分配釋放,程式設計師申請時需要指明大小,leg,c語言中malloc函式 p1 char malloc 10 c 中 p2 new char 20 若程式設計師不去釋放,當程式結束時可能由作業系統釋放 注意其與資料結構的堆完全是兩回事,分配方式類似於鍊錶,分配...

堆(Heap)和棧(Stack 轉 整理

一 程式的記憶體分配 1 棧區 stack 由編譯器自動分配釋放 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性...

C C 中的堆和棧整理

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放 程式結束時可能由os 注意它與資料結...