IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Выделение памяти, FPC
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Что-то я не понимаю, почему для Byte и LongInt выделяется одно и тоже кол-во памяти ?

var
pByte : ^Byte;
pLong : ^LongInt;
mem1, mem2 : LongInt;

begin
mem1 := GetHeapStatus.TotalFree;
New(pByte);
mem2 := GetHeapStatus.TotalFree;
writeln('Для pByte выделено ', mem1 - mem2);
New(pLong);
mem1 := GetHeapStatus.TotalFree;
writeln('Для pLong выделено ', mem2 - mem1);
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Внимательно читаем файл prog.pdf (из документации на FPC):
Цитата
8.4.1 Heap allocation strategy

The heap is a memory structure which is organized as a stack. The heap bottom is stored in the variable HeapOrg. Initially the heap pointer (HeapPtr) points to the bottom of the heap. When a variable is allocated on the heap, HeapPtr is incremented by the size of the allocated memory block. This has the effect of stacking dynamic variables on top of each other.

Each time a block is allocated, its size is normalized to have a granularity of 16 bytes.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Спасибо, так и думал что какая-то нормализация ... TP так-же выдает одинаковый результат - 8.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Теперь я окончательно ничего не опнимаю :

uses crt;
type
TArray = array of byte;

var
A : TArray;

begin
clrscr;
writeln('Before Init : ', GetHeapStatus.TotalFree);
SetLength(A, 100);
writeln('After Init : ', GetHeapStatus.TotalFree);
SetLength(A, 0);
writeln('After Free : ', GetHeapStatus.TotalFree);
readln;
end.


Цитата

Before Init: 65456
After Init : 98112
After Free : 98224


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






А теперь посмотри сюда:

uses crt;
type
TArray = array of byte;

var
A : TArray;

begin
SetLength(A, 10);
SetLength(A, 0);

clrscr;
writeln('Before Init : ', GetHeapStatus.TotalFree);
SetLength(A, 100);
writeln('After Init : ', GetHeapStatus.TotalFree);
SetLength(A, 0);
writeln('After Free : ', GetHeapStatus.TotalFree);
readln;
end.
Чувствуешь? Если ты пытаешься обратиться к GetHeapStatus перед первым обращением к SetLength, то получаешь совсем не то, что получишь после первого SetLength... Скорее всего, для объяснения придется копать в сторону счетчика ссылок (reference count)...

Для начала - глянь здесь: Длинные строки и динамические массивы в Delphi
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Обалдеть ... Спасибо rolleyes.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 23.09.2017 9:04
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"