Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
(本信件原發表於DelphiChat一九九七年二月二日)
最近與朋友在討論一個話題, 僵持許久, 不曉得各位對此的看法如何呢?
依據手冊上對 $MINSTACKSIZE 與 $MAXSTACKSIZE 這兩個的說明如下:
$MINSTACKSIZE 與 $MAXSTACKSIZE 的預設值大小分別是 16384, 1048576
$MINSTACKSIZE 必須是一個介於 1024 至 2147483647 之間的整數
$MAXSTACKSIZE 必須是一個介於 $MINSTACKSIZE 至 2147483647 之間的整數
以上的說明, 我們發現以下幾點:
![]() |
1. $MINSTACKSIZE 必須是介於 16384 至 16777216 之間的整數才對, 該項數據是從 Project/Options.../Linker, 在 Min Stack Size 中輸入 $00000001 之後, Delphi IDE 提示建議的數字 |
![]() |
2. $MAXSTACKSIZE 也有一個必須滿足的最小值, 我們推論極可能是: $00010000, 也就是說, 任何小於 $00010000 的 $MAXSTACKSIZE 都不被承認, 程式執行時, 堆疊的最大值是 $00010000 |
![]() |
3. 承 2. 而且 $MAXSTACKSIZE 的實際數字一定是 $00010000 的倍數. 也就是說, 程式可使用的堆疊大小, 實際上是 $00010000的倍數. |
我們初步的結論是 --
![]() |
1. $MINSTACKSIZE 必須是介於 16384 至 16777216 之間的整數 |
![]() |
2. 程式可用的最大堆疊大小不一定是 $MAXSTACKSIZE 設定的值,
1) 最大堆疊至少有 $00010000 可用 2) 最大堆疊會自動以 $MAXSTACKSIZE 的設定尋求大於等於該項設定的 $00010000 倍數, 換句話說, 程式實際可用的堆疊大小是 $00010000 的倍數. |
以上初步的結論就教於各位的看法. :)
附上實驗的步驟與方法.
0. 假定 System, SysUtil... 等標準的單元所需的變數記憶體大小為 $3EEE;
1. 第一個實驗,
檢驗 $MAXSTACKSIZE 最小必定是 $00010000
{$MINSTACKSIZE $00004000} {$MAXSTACKSIZE $00004000} program Project1; ... --- unit Unit1; .. implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); const _Test = $10000 - $3FFF; var a: packed array[1.._Test] of byte; begin a[_Test] := 0; end; ...
2.
第二個實驗, 檢驗 $MAXSTACKSIZE 的設定設得比 $MINSTACKSIZE 小也沒關係, 反正實際上必定是
>= $00010000
{$MINSTACKSIZE $00004000} {$MAXSTACKSIZE $00000001} program Project1; ... --- unit Unit1; .. implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); const _Test = $10000 - $3FFF; var a: packed array[1.._Test] of byte; begin a[_Test] := 0; end; ...
3.
第三個實驗, 檢驗 $MAXSTACKSIZE 實際上必定是 $00010000 的倍數.
{$MINSTACKSIZE $00004000} {$MAXSTACKSIZE $00010001} program Project1; ... --- unit Unit1; .. implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); const _Test = $20000 - $3FFF; var a: packed array[1.._Test] of byte; begin a[_Test] := 0; end; ...
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |