Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.25;
Скачать: CL | DM;

Вниз

Как создать в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
7-80701
vvvico
2001-12-20 12:12
2002.03.25
Проблемка с W2K


1-80621
dimonf
2002-03-11 21:07
2002.03.25
Господа, подскажите, как можно добавлять строки в StringGrid в цикле не зная заранее, сколько у меня, будет записей?


1-80456
Gayrus
2002-03-08 04:25
2002.03.25
Кодировка


1-80617
Ruslan
2002-03-11 16:24
2002.03.25
Модем


14-80681
Andrews
2002-02-12 12:03
2002.03.25
А когда у сайта день рождения?