Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
15-1206091883
Slider007
2008-03-21 12:31
2008.05.04
С днем рождения ! 21 марта 2008 пятница


2-1207638630
MKS_
2008-04-08 11:10
2008.05.04
сбросить modal


2-1207326009
XRMiPO
2008-04-04 20:20
2008.05.04
событие OnClick в TwebBrowser


6-1185938122
Inearthed
2007-08-01 07:15
2008.05.04
Определение существования папки на FTP


3-1196414781
Ega23
2007-11-30 12:26
2008.05.04
Вопрос по устройству SP в FireBird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский