Подскажите функцию RTL для выделения памяти под массив

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Подскажите функцию RTL для выделения памяти под массив

Сообщение Cheb » 26.06.2014 10:26:29

Я помню, что есть такая, но название забыл :(

Если кто навскидку помнит - подскажите пожалуйста.

Дано: в моей библиотеке для сериализации классов используются сценарии, строящиеся на основании rtti и заданного вручную списка полей.

Для работы с полями типа массив используется функция (указатель на поле, размер элемента массива). Она тупо трактует поле как array of byte, выполняет SetLength() используя <размер>*<размер элемента для данного типа>, затем подмухлёвывает счётчик элементов по отрицательному смещению.

Меня, однако, гложут сомнения, что это не совсем верно. Вот в связи с этим вопрос:

Массивы любых типов используют один и тот же аллокатор памяти, или возможны варианты?

Потому что если возможны варианты, и там для перераспределения памяти используется какая-то эвристика без проверки реального значения размера куска, то возможны неприятные ситуации, когда увеличение размера + запись в массив запортят память от того, что там, теоретически, должно было быть больше.

(борюсь с явным засиранием памяти в программе, но range и overflow checking уже ничего нового не дают)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Подскажите функцию RTL для выделения памяти под массив

Сообщение runewalsh » 28.06.2014 01:37:18

System.DynArraySetLength?
Неужели снова chepersy? 64 бита будут? C:

Менеджер памяти используется один, стандартный или тот, что задан SetMemoryManager. Ну и тем, что ты написал, вроде как только он и занимается. По крайней мере, смотри, такая вот программка:
Код: Выделить всё
  function DynarrayToMemoryBlock(var arr): pointer;
  begin
    result := pPointer(arr) - 2;
  end;

  function MemoryBlockToDynarray(block: pointer): pointer;
  begin
    result := pPointer(block) + 2;
  end;

  procedure ForceReallocDynarrayBlock(var arr; datasize: cardinal);
  var
    t: pointer;
  begin
    t := DynarrayToMemoryBlock(arr);
    ReallocMem(t, datasize + 2 * sizeof(pointer));
    pointer(arr) := MemoryBlockToDynarray(t);
  end;

var
  i: integer;
  a: array of longword;
  oldSize, curSize: cardinal;

begin
  oldSize := 0;
  for i := 1 to 25 do
  begin
    SetLength(a, i);
    // ForceReallocDynarrayBlock(a, 100 * i * sizeof(longword));
    // ForceReallocDynarrayBlock(a, i * sizeof(longword));

    curSize := MemSize(DynarrayToMemoryBlock(a));
    if curSize <> oldSize then
    begin
      writeln(i, '+: memsize = ', curSize);
      oldSize := curSize;
    end;
  end;
end.
работает независимо от закоментированных строчек, при том, что поведение меняется: у меня без двух ForceReallocDynarrayBlock получаются 4 реаллокации (на i = 1, 2, 10, 26) (в FPC-шном менеджере эта вот красивая логарифмическая картинка реаллокаций на бо́льших размерах исчезает, к сожалению, так что трюки вроде ручного удвоения размера актуальны), а с ними — i = 1, 2 + 4N (N ≥ 0).
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Подскажите функцию RTL для выделения памяти под массив

Сообщение Cheb » 30.06.2014 15:12:47

System.DynArraySetLength?

Спасибо :)))
То, что надо.

Неужели снова chepersy? 64 бита будут? C:

Она, родимая. Будут.
Но лучше было бы интегрировать меня в Еву-01, на случай, если это радостное событие произойдёт после тепловой смерти вселенной.

А если серьёзно, то я сейчас на стадии выгребания тонн говнокода из своего игрового движка. Включая чеперси.

Просто не дело, когда программа крашится если компилировать с оптимизацией, отличной от -O2 . Где-то портится память. Пока это не разгребу - движения вперёд не будет.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Подскажите функцию RTL для выделения памяти под массив

Сообщение runewalsh » 01.07.2014 03:36:40

Cheb писал(а):я сейчас на стадии выгребания тонн говнокода из своего игрового движка.

E-eto... А ч-что ты думаешь о моём (viewtopic.php?f=10&t=8865)?
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru