powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамические массивы в Delphi XE7 - XE10
23 сообщений из 48, страница 2 из 2
Динамические массивы в Delphi XE7 - XE10
    #39506484
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот кстати, можно ли для динамического массива выделить больше памяти чем его указаный размер.
К как при этом изменять его размер без реаллока?
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506488
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey_Vasilisk_но что из этого получится - сам знаешь
Ничего страшного.Out of memory отгребешь.

Ну сравните уже код
Код: pascal
1.
2.
3.
SetLength(Data, 0);
for i := 0 to Round(1E+6) do
  SetLength(Data, Length(Data) + 1);


Код: pascal
1.
SetLength(Data, Round(1E+6));


Код: pascal
1.
2.
3.
4.
5.
6.
7.
LStrm := TMemoryStream.Create;
try
  for i := 0 to Round(1E+6) do
    LStrm.Write(LBuf, 1);
finally
  LStrm.Free;
end;


на быстродействие и потребляемую память
Kazantsev AlexeyА если мне не нужен интерфейс стрима, зачем огород-то городить?Чтобы не писать собственный Grow-костыль
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506492
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_schiTBytes. Удобно, знаете ли.На любителя. Нет, конечно, если Вас не смущает постоянные реаллоки + бешеное фрагментирование памяти, то используйте, на здоровье.

Меня не смущает. Мне кажется, что постоянность реаллоков и бешенство фрагментирования памяти несколько преувеличены.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506493
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВот кстати, можно ли для динамического массива выделить больше памяти чем его указаный размер.
К как при этом изменять его размер без реаллока?Можно. Если хранить отдельно выделенный и реальный размер. Что и делает TBytesStream
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506495
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВот кстати, можно ли для динамического массива выделить больше памяти чем его указаный размер.
К как при этом изменять его размер без реаллока?
Точно так же, через SetLength() и хранить размер используемой памяти отдельно. Но фишка в том, что SetLength() использует тот же ReallocMem что и TMemoryStream и при небольших изменениях длины массива обычно не происходит копирования данных. А TStream для каждого буфера использовать довольно накладно в плане оверхеда.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506499
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Чтобы не писать собственный Grow-костыль
Обычно сценарий при использовании TBytes выглядит так:
1. Получить размер данных
2. Выделить память
3. Получить данные

или так:
1. Выделить максимально возможный размер для данных
2. Получить данные
3. Уменьшить размер по факту.

В таких случаях TMemoryStream - излишен.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506504
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpОбычно сценарий при использовании TBytes выглядит так:
1. Получить размер данных 20728743
_Vasilisk_Если размер известен заранее, то массив, если нет - TList
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506506
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_alekcvpОбычно сценарий при использовании TBytes выглядит так:
1. Получить размер данных 20728743
_Vasilisk_Если размер известен заранее, то массив, если нет - TList
Читается как "если размер известен на этапе компиляции".
Ну и второй сценарий не попадает в любом случае.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506508
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Нет, конечно, если Вас не смущает постоянные реаллоки + бешеное фрагментирование памяти, то используйте, на здоровье.
Ты сам-то проверял, прежде чем писать это?
_Vasilisk_Чтобы не писать собственный Grow-костыль
Поиграем в реаллокации
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var

 bts     : TBytes;
 old     : NativeInt;
 oldSize : NativeInt;
 i       : Integer;
 r       : Integer;

 bts2 : TBytes;
 bts3 : TBytes;
 bts4 : TBytes;
 bts5 : TBytes;

begin

 r := 0;
 old := 0;
 oldSize := 0;

 for i := 1 to 1024 * 1024 do
  begin

   SetLength(bts, i);
   // чтобы MM жизнь мёдом не казалась...
   SetLength(bts2, i);
   SetLength(bts3, i);
   SetLength(bts4, i);
   SetLength(bts5, i);

   If old <> NativeInt(bts) Then
    begin

     inc(r);

     writeLn(i, ' -> ', i - OldSize);

     old := NativeInt(bts);
     oldSize := i;

    end;

  end;

 WriteLn('reallocations: ', r);
 ReadLn;

end.


Итого, на 1048576 операций изменения размера, реальных реаллокацуий: на FastMM - 17, на голом позиксе 57.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506510
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpТочно так же, через SetLength() и хранить размер используемой памяти отдельно.
Не, интересно именно захакать сам Array, дабы менять его длинну не вызывая Realloc-ов.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506512
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где посмотреть его структуру в памяти?
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506514
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatГде посмотреть его структуру в памяти?
Поставь дебаг на SetLength() и пошагово посмотри, там найдёшь. Примерно такая же как у старых string: -4 байта длина, потом данные. RefCount не помню есть или нет. Если хочешь хакнуть, то скорее всего получишь свой TMemoryStream, т.к. придётся писать и свою SetLength() для своего массива.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506519
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел вот:

Код: pascal
1.
2.
3.
-8  32-bit = reference-count  
-4  32-bit = length indicator (number of elements)  
0..Length * (size of element) -1 = array elements



А что там для x64?
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506526
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В TMemoryStream есть protected свойство Capacity. Однажды было проще использовать, чем Size со всеми "запоминаниями". (Было что-то типа Capacity := Trunc(примерный_размер_данных * 1.5))
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506539
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyТы сам-то проверял, прежде чем писать это?Проверял. D2006 или D7, уже не помню, поднимала Out of memory
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506541
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Проверял. D2006 или D7, уже не помню
Дельфя начиная с D2006 идёт с FasMM по дефолту.

p.s. Сперва топит за TList<>, а потом вспомнил о D7. Смешно.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39506659
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ Я на 2006 написал свой TList, который на Add делал GetMem, а на Delete - Finalize + FreeMem.
Любые манипуляции с динамическим массивом в результате заканчиваются "своим собственным TList/TObjectList".
Этот "TMySuperList" делает всё тоже самое что и обычный TList, только
1. Реализованы такими алгоритмами, которые были актуальны для точки зрения автора на тот конкретный момент его жизни. Чаще всего - с ошибками.
2. Никаких явный преимуществ данный новый класс не даёт.
3. Что бы работать с таким классом, надо будет "понять" и разобраться в гениальных идеях автора, т.е. мыслить как он n-лет назад, и переделать на стандартный TList.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39507085
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatГде посмотреть его структуру в памяти?

в самом неожиданном и непредсказуемом месте

Delphi -> Documentation -> Data Types -> Internal Data Formats

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/About_Data_Types_(Delphi)
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39507122
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochDelphi -> Documentation -> Data Types -> Internal Data Formats
А ссылку кривую дал :) http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Internal_Data_Formats_(Delphi)
Только там про дин. массивы чушь написана. Реальное положение дел описано в System.pas - TDynArrayRec;
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39507126
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TArrayEx<T>.SetLengthFast(NewValue: integer);
const
  GrowLimit = 64;
begin
  if FInitCapacity='' then begin
    FInitCapacity:='Y';
    FCapacity:=0;
  end;

  if NewValue<=0 then begin
    FCapacity:=0;
    SetLength(Items,0);
  end else begin
    if (NewValue>FCapacity) or (NewValue shl 1<FCapacity) then begin
      FCapacity:=Min(NewValue shl 1,NewValue+GrowLimit);
      SetLength(Items,FCapacity);
      FArrayCount:=PNativeInt(NativeInt(@Items[0])-SizeOf(NativeInt));
    end;
    FArrayCount^:=NewValue;
  end;
end;

Вышло более чем вдвое быстрей чем обычный циклический SetLength+1.
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39507159
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyТолько там про дин. массивы чушь написана.
Посыпаю голову пеплом. Всё нормально там написано :)
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39507215
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВышло более чем вдвое быстрей чем обычный циклический SetLength+1.А почему не в (64-1) раза быстрей?
...
Рейтинг: 0 / 0
Динамические массивы в Delphi XE7 - XE10
    #39507221
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,

Видимо в FastMM (?) уже есть некая оптимизация.
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамические массивы в Delphi XE7 - XE10
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]