Możliwości alokacji RAM są w Delphi ograniczone. W TP graniczną wartością było 64 kB, co prawdopodobnie wynikało z 16 bitowej architektury tego kompilatora. W D. 10.4 można by analogicznie oczekiwać górnej granicy=2^32 bajtów. Okazuje się jednak, że jest to ok. 2^30,8 bajtów. W TP można było tworzyć stertę aby przezwyciężyć te ograniczenia. Próbowałem zrobić to samo w D.10.4, starając się przy tym znaleźć największe osiągalne rozmiary warstw sterty. Posłużyłem się w tym celu metodą obramowania celu stosując instrukcję try...except w charakterze if then else, wychodząc od rozmiaru alokowanego bloku RAM Up > 2^32. Postępowanie realizowałem wg schematu:
a:=UP; b:=0; P:=Up; OK:=True; step:=0;
b1:=b;
repeat
inc(step);
try
setLength(heapLayer,0);
setLengt(heapLayer,P);
a1:=a; b1:=b;
OK:=True;
b:=P;
P:=(a+b) div 2;
except
setLength(heapLayer,0);
a:=P;
P:=(a+b) div 2;
OK:=false;
end;
until OK and ((b1=b) or (b=P) or (step=1));
Warunkiem stabilnego działania okazało się zerowanie rozmiaru warstwy zarówno przed próbą alokacji RAM o rozmiarze P w części try, jak i w części except - po nieudanej próbie. Warunek OK and ((b1=b) or (b=P)) przerywa iterację, gdy wynik powtórzył się, lub gdy trafił w centrum, zaś OK and (step=1) przerywa działanie, gdy warstwie z sukcesem alokowana jest RAM już przy P=Up (jak to będzie mieć miejsce przy małych wielkościach alokowanej RAM.
Celem było określenie maksymalnej wartości kęsu RAM, jaki można zaalokować jakiejś zmiennej dynamicznej i zbadanie, czy wielkość ta będzie taka sama dla innych alokacji, w tym przypadku - czy każdej kolejnej warstwie sterty można alokować taki sam kęs RAM, jaki określono dla pierwszej warstwy bez ryzyka, że nie zawsze będzie to akceptowane.
Metoda daje akceptowalne oceny, ale daje różne wartości kęsów dla kolejnych warstw sterty (rozbieżność nawet rzędu 1%). Niekiedy pętla repeat nie jest od razu przerywana mimo spełnienia warunku kończącego.
Wniosek: ten sposób określenia maksymalnego kęsu RAM napotyka nieznane problemy techniczne. Mam nadzieję na interesujące kontrpropozycje.
Programik (postać exe i kod w D.10.4) o nazwie maxHeap realizujący tę metodę można pobrać ze strony
https://apl.home.amu.edu.pl/apl/.
Miłej zabawy!
apl