Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Riply ©   (2008-04-09 00:49:00) 

Здравствуйте !
Пусть есть некая структура 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.
Может есть другие, более "рациональные" варианты ?


Riply   (2008-04-10 02:47:00) [1]

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

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


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

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


Riply   (2008-04-09 15:12:00) [3]

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

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

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

Спасибо.


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


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

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


Riply   (2008-04-09 10:18:00) [5]

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

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

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

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


guav   (2008-04-09 09:37:00) [6]

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


Loginov Dmitry   (2008-04-09 07:59:00) [7]

> 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
отпадет в этом случае


Наверх

Титульная страница Поиск, карта сайта Написать письмо