Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.04;
Скачать: CL | DM;

Вниз

Выбор типа структуры для хранения данных и работы с ними.   Найти похожие ветки 

 
Riply ©   (2008-04-09 00:49) [0]

Здравствуйте !
Пусть есть некая структура PMyHoldRecord = ^TMyHoldRecord(Ptr),
которая будет очень много раз создаваться и уничтожаться.
Также будет много обращений к ее полю такого типа: SecondParam[Index]^.
Какой тип ее представления (из данных вариантов) лучше выбрать и почему ?

type
TMyHoldRecord = record
 BytesPerFirstParam: DWord;
 OffsetToSecondParam: DWord;
 BytesPerSecondParam: DWord;
 FirstParam: array[0..0] of Byte;
 function SecondParam(Index: integer): Pointer;
end;

type
TMyHoldRecordPtr = record
 BytesPerFirstParam: DWord;
 FirstParam: Pointer;
 BytesPerSecondParam: DWord;
 SecondParam: array[0..0] of Pointer;
end;


P.S.
Может есть другие, более "рациональные" варианты ?


 
Loginov Dmitry ©   (2008-04-09 07:59) [1]

> FirstParam: array[0..0] of Byte;


Вот это какая-то опасная конструкция. Тут будет быделен всего 1 байт памяти. Правильней так объявить:
TByteArray = array[0..0] of Byte;
PByteArray = ^TByteArray;

TMyHoldRecord = record
BytesPerFirstParam: DWord;
OffsetToSecondParam: DWord;
BytesPerSecondParam: DWord;
FirstParam: PByteArray;
end;

SecondParam
отпадет в этом случае


 
guav ©   (2008-04-09 09:37) [2]

А в чём проблема ?
Надо выделить структуру из двух массивов обязательно одним куском ?
Если это требование явно не следует из задачи, я бы объявил так:
type
 TMyHoldRecord = record
   first:  array of Byte;
   second: array of Pointer;
 end;


 
Riply ©   (2008-04-09 10:18) [3]

TMyHoldRecord "статически" вообще не будет объявляться.
Размер FirstParam (BytesPerFirstParam) будет известен при ее создании и
в поцессе ее жизни меняться не будет.

Размер же SecondParam (BytesPerSecondParam) будет изменяться в течении ее жизни.
С его элементами (обращение по индексу) и будет идти основная работа.

Вопрос о типе встал потому, что MyHoldRecord - ы будут очень много раз рождаться и умирать.
Хочется понять, что лучше: в два раза чаще выделять память, но работать с SecondParam "напрямую",
или сэкономить на выделениии/освобождении и при этом обращаться к SecondParam через функцию ?

P.S.
Лазила по генофонду. Там и так и так объявляют.
А вот из чего исходят при выборе, понять не сумела.


 
clickmaker ©   (2008-04-09 10:29) [4]


> А вот из чего исходят при выборе, понять не сумела.

я так думаю, что по принципу что приоритетней для данной задачи. Скорость за счет памяти или наоборот.
Выделение памяти при "работать с SecondParam "напрямую" всяко дольше, чем "сэкономить на выделениии/освобождении" + накладные на вызов функции.
Если размер памяти существенно не меняется в процессе жизни программы, я бы выбрал второй вариант


 
Riply ©   (2008-04-09 15:12) [5]

> [4] clickmaker ©   (09.04.08 10:29)

> Выделение памяти при "работать с SecondParam "напрямую" всяко дольше,
> чем "сэкономить на выделениии/освобождении" + накладные на вызов функции.
> Если размер памяти существенно не меняется в процессе жизни программы, я бы выбрал второй вариант

Существенно не меняется. От 3 * SizeOf(Int64) примерно до 4096 * 3 * SizeOf(Int64) байт.
Среднестатистический: ~ 4 * 3 * SizeOf(Int64)
Это как бы массив, в который могут дописываться данные по мере поступления.

Спасибо.


 
Sapersky   (2008-04-09 18:12) [6]

Если SecondParam - это массив однотипных данных, то обращение напрямую можно сделать независимо от того, как он хранится. Добавить к записи массив-указатель SecondParam: PMyTypeArray (PMyTypeArray = ^TMyTypeArray; TMyTypeArray = array[0..0] of TMyType) и при каждом перевыделении общего блока "навешивать" его на начало блока + SizeOf(FirstParam), примерно так:
SecondParam := PMyTypeArray(Integer(CommonBlockPtr) + SizeOf(TFirstParam));


 
Riply ©   (2008-04-10 02:47) [7]

> [6] Sapersky   (09.04.08 18:12)
> Добавить к записи массив-указатель SecondParam: PMyTypeArray

В результате так и поступила. Возможны, правда и "подводные камни".
Надо будет аккуратно работать с этой структурой, особенно при использовании With :)



Страницы: 1 вся ветка

Текущий архив: 2008.05.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
3-1196670098
Натуля
2007-12-03 11:21
2008.05.04
SQL Server - ADO Connection - Delphi


2-1207486169
dumka
2008-04-06 16:49
2008.05.04
Канва


2-1207499830
savyhinst
2008-04-06 20:37
2008.05.04
BPL


10-1145087125
Frodo44
2006-04-15 11:45
2008.05.04
Memo и Word


2-1207636459
nicky000
2008-04-08 10:34
2008.05.04
NULL