Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
ВнизКак создать в Delphi нестандартный тип? Например .. Найти похожие ветки
← →
Abzetdin (2002-03-09 21:33) [0]Пожалуйста, помогите как создать в Delphi нестандартный тип? Например, известно, что минимальным целым типом является Byte (8 bit). Возможно ли определить целый тип скажем из 3-х битов и как это сделать?
Цель заключается в экономии RAM.
Заранее примного благодарю.
← →
Anatoly Podgoretsky (2002-03-09 21:37) [1]Abzetdin (09.03.02 21:33)
=====================================
Пожалуйста, помогите как создать в Delphi нестандартный тип? Например, известно, что минимальным целым типом является Byte (8 bit). Возможно ли определить целый тип скажем из 3-х битов и как это сделать?
Цель заключается в экономии RAM.
=====================================
У меня еще в кеше сохранился :-)
Минимальная единица хранения 1 байт.
Можно пытать вручную упаковывать данные в несколько байт, наприме в Cardinal можно упаковать 10 3-битных элементов
Какое количество данных и сколько готов отпустить под хранение?
← →
Abzetdin (2002-03-09 21:44) [2]To Anatoly Podgoretsky
Смогу ли я упаковать, скажем, 1000 3-х битных элементов в массив типа Cardinal?
Спасибо...
← →
panov (2002-03-09 21:51) [3]Для чего, интересно, если не секрет, настолько экономить RAM?
Максимальная экономия - в 2,6 раза, а скорость работы с данными упадет просто несравнимо.
← →
Anatoly Podgoretsky (2002-03-09 21:52) [4]Да сможешь, но выгода будет ничтожная, создай лучше массив на 1000 элементов типа байт, а еще лучше интегер, хоть он и будет больше занимать места, работать будет проще и быстрее. Смело можешь не экономить до 1 000 000 элементов, всего 1 или 4 мегабайта.
← →
Иван Шихалев (2002-03-09 22:25) [5]Зависит от логики работы с типом. Можно ведь и set of использовать...
← →
Abzetdin (2002-03-09 22:37) [6]Такая экономия очень нужна = решается проблема размещения элементов на печатной плате, а при количестве элементов даже в 100 X 100, матрица инцидентности будет представлять собой массив
10 000 X 10 000, нетрудно подсчитать что при использовани Byte потребуется 100 MB RAM. 2,6 раз это существенная экономия.
Буду благодарен за любые предложения ...
← →
Anatoly Podgoretsky (2002-03-09 22:38) [7]set of у него не получится, массив на 1000 3-битных элементов
← →
Иван Шихалев (2002-03-09 22:53) [8]Тогда лучше использовать ассемблер и двоично десятичную арифметику. Экономия, правда, будет вместо 2.6, всего в 2 раза...
← →
Anatoly Podgoretsky (2002-03-09 23:07) [9]Abzetdin (09.03.02 22:37)
Я думаю будет серьезный проигрыщ в производительности, учитывая характер задачи, ни как не перекроет экономию памяти, даже использования байта серьезно повлияет на производительность, реалнее подумать об увеличении памяти до 512/1024 мегабайта и переход на Integer, память в наше время стоит недорого, а время дороже.
← →
drpass (2002-03-09 23:17) [10]Измени алгоритм - например, разбей схему на логические блоки, каждый из которых будет обрабатываться отдельно. Иначе даже просчет такой схемы будет выполняться похлеще, чем рендеринг "Шрека" (кстати, кто не видел, рекомендую посмотреть :)
Матрица, насколько я понимаю, симметрична - поэтому можно хранить только ее половину.
И учти, что компилятор по умолчанию выравнивает данные по размеру машинного слова, т.е. даже тип byte физически занимает 4 байта (при этом ощутимо увеличивается быстродействие обработки).
Вообще, (мне так кажется) в твоем случае не стоит создавать какой-то новый тип данных, а выделить единый блок динамической памяти и помещать в него данные. Затем побайтно извлекать элементы и с помощью логических операций (shl, shr, and) выделять требуемые биты
← →
Бурундук (2002-03-09 23:23) [11]Можно, конечно, изобрести нечто вроде
(Но я не уверен, что по скорости это тебе подойдёт)
type
PArray = ^TArray;
TArray = array[0..MaxInt div 16]of Int64;
T3BitArray = class
private
FArray: PArray;
FLength: Integer;
FSize: Integer;
public
function Get(I: Integer): Byte;
procedure Put(I: Integer; Value: Byte);
property Elements[I: Integer]: Byte read Get write Put; default;
constructor Create(ALength: Integer);
destructor Destroy; override;
end;
implementation
{----------------------- T3BitArray ---------------------------}
constructor T3BitArray.Create(ALength: Integer);
begin
FLength := ALength;
FSize := Round(ALength*8/21)+1;
ReallocMem(FArray, FSize);
end;
destructor T3BitArray.Destroy;
begin
ReallocMem(FArray, 0);
end;
function T3BitArray.Get(I: Integer): Byte;
var N, b: Integer;
begin
N := I div 21;
b := I mod 21;
Result := (FArray^[N] shr b*3) and $7;
end;
procedure T3BitArray.Put(I: Integer; Value: Byte);
var N, b: Integer;
begin
N := I div 21;
b := I mod 21;
FArray^[N] := ((Value and $7) shl b*3) or ( (not($7 shl b*3))and(FArray^[N]) );
end;
← →
Abzetdin (2002-03-12 21:02) [12]Благодарю всех, я скорее всего последую вашему совету и постараюсь, если это будет возможным, использовать Integer.
To drpass: Суть программы в этом и заключается, т.е. процесс размещения происходит с использование ресурсов локальной сети, а информация передается сокетами. В связи с этим у меня будет другой вопрос....
Спасибо
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c