Форум: "Начинающим";
Текущий архив: 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]А в чём проблема ?
Надо выделить структуру из двух массивов обязательно одним куском ?
Если это требование явно не следует из задачи, я бы объявил так:
typeTMyHoldRecord = 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