Главная страница
    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.47 MB
Время: 0.006 c
15-1205880891
builder
2008-03-19 01:54
2008.05.04
Работа с сокетами в общем


2-1207563530
_ozzy_
2008-04-07 14:18
2008.05.04
Как активизировать окно моего приложения?


2-1207744045
Снежинка
2008-04-09 16:27
2008.05.04
Пароль


3-1196447499
wipr
2007-11-30 21:31
2008.05.04
нет стабильной работы в InterBase по Wi-Fi


2-1207687754
Riply
2008-04-09 00:49
2008.05.04
Выбор типа структуры для хранения данных и работы с ними.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский