Помощь - Поиск - Пользователи - Календарь
Полная версия: "Шаровая" оперативка
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Free Pascal, Pascal ABC и другие
Bokul
Заинтересовал? smile.gif Вот они - чудо компиляторы...

Запускаем код и радуемся результатам:

type
ar=array[1..65456] of byte;
ar2=array[1..327600] of byte;
var p:^ar;
p2:^ar2;
begin
writeln('Free memory before allocation: ',GetHeapStatus.TotalFree);
new(p);
writeln('Free memory after allocation: ',GetHeapStatus.TotalFree);
dispose(p);
writeln('Free memory after dispose: ',GetHeapStatus.TotalFree);
new(p2);
writeln('Again allocation: ',GetHeapStatus.TotalFree);
dispose(p2);
writeln('Again dispose: ',GetHeapStatus.TotalFree);
readln;
end.


Системный блок раскручивать необязательно - все изменения проходят на программном уровне.
P.S. Не знаю как энергия, но память из ниоткуда можно получить.. Fpc is the best smile.gif
P.P.S.
Причина, наверно, кроется вот в чем:
Нажмите для просмотра прикрепленного файла
Т.е. тип cardinal, возвращаемый методом TotalFree, не имеет постоянного размера, и меняется в зависимости от присваиваемого значение. Имхо.
Так вот, вопрос: как в Fpc измерять разницу свободной памяти до и после размещения в ней данных, без всяких таких казусов?
volvo
Bokul, доки внимательно читал? smile.gif
Цитата(prog.pdf)
8.4.3 Debugging the heap
Free Pascal provides a unit that allows you to trace allocation and deallocation of heap memory:
heaptrc.
If you specify the -gh switch on the command-line, or if you include heaptrc as the first unit in
your uses clause, the memory manager will trace what is allocated and deallocated, and on exit of
your program, a summary will be sent to standard output.
ну, и близлежащие параграфы...
Bokul
Ясно, GetHeapStatus для этих целей не годится - надо юзать модуль heaptrc sad.gif

Вот в таком формате heaptrc выдает свой заголовок (а потом еще 200 метров отчета):
Цитата

Heap dump by heaptrc unit
1010000 memory blocks allocated : 12840000/16880000 - что значат выделенные числа?
10000 memory blocks freed : 840000/880000 - что значат выделенные числа?
1000000 unfreed memory blocks : 12000000
True heap size : 80216064 (80 used in System startup)
True free heap : 215984
Should be : 8215984

Цитата
It displays the total memory used, and then dumps a list of blocks that were allocated but not freed

На что надо смотреть? На unfreed memory blocks?
volvo
Цитата
На что надо смотреть? На unfreed memory blocks?
В принципе - да, именно это показывает тебе, есть ли у тебя утечки... Так вот, если утечек нет - то нет ничего кроме заголовка...

Насчет цифр -
Цитата
12840000/16880000
Первая - это количество байт, запрошенных компилятором, вторая - число выделенных байт (с учетом гранулярности - ибо память выделяется блоками по 8 байт, и запросив 1 байт ты получишь 8)
Bokul
Ага, спасибо! smile.gif
Цитата
(с учетом гранулярности - ибо память выделяется блоками по 8 байт, и запросив 1 байт ты получишь 8

Или 16..
Цитата
Each time the block is allocated, its size is normalized to have granularity of 16 bytes


Так что на самом деле дает GetHeapStatus.TotalFree? Для чего возвращаемый результат может иметь разный размер и как узнать весь объем доступной памяти?
volvo
Цитата
как узнать весь объем доступной памяти
Ха... Что значит "весь объем"?

Цитата(prog.pdf)
8.7 Memavail and Maxavail
The old Turbo Pascal functions MemAvail and MaxAvail functions are no longer available in Free Pascal as of version 2.0. The reason for this incompatibility is below:
On modern operating systems the idea of "Available Free Memory" is not valid for an application.
The reasons are:
1. One processor cycle after an application asked the OS how much memory is free, another application may have allocated everything.
2. It is not clear what "free memory" means: does it include swap memory, does it include disk cache memory (the disk cache can grow and shrink on modern OS’es), does it include memory allocated to other applications but which can be swapped out, etc.

Итак, что будем считать всей памятью? wink.gif
Bokul
Цитата
2. It is not clear what "free memory" means: does it include swap memory, does it include disk cache memory (the disk cache can grow and shrink on modern OS’es), does it include memory allocated to other applications but which can be swapped out, etc.

Ага, при тестировании той проги при количестве полигонов больше миллиона комп начинал жутко тормозить, а индикатор обращения к винту не утихал - размер кеша доходил до 2 гиг.
Цитата
Итак, что будем считать всей памятью?

Задам вопрос по-другому: как проверит при запуске программы доступно ли для ее работы, например, гигабайт памяти?
volvo
А это тебе никто не скажет... У тебя swap-файл какой разрешен? Сколько физической памяти стоит? Сколько ее свободно в момент запуска программы? Даже если свободно больше физической памяти, чем ты указал, то кто сказал, что через секунду после запуска твоей программы не запустится, скажем, антивирус, или какой-нибудь сервис с более высоким приоритетом, и не сожрет львиную долю памяти?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.