Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как создать в Delphi нестандартный тип? Например .. [D5, D6, NT4]


Abzetdin ©   (2002-03-09 21:33:00) 

Пожалуйста, помогите как создать в Delphi нестандартный тип? Например, известно, что минимальным целым типом является Byte (8 bit). Возможно ли определить целый тип скажем из 3-х битов и как это сделать?
Цель заключается в экономии RAM.

Заранее примного благодарю.


Abzetdin   (2002-03-12 21:02:00) [1]

Благодарю всех, я скорее всего последую вашему совету и постараюсь, если это будет возможным, использовать Integer.

To drpass: Суть программы в этом и заключается, т.е. процесс размещения происходит с использование ресурсов локальной сети, а информация передается сокетами. В связи с этим у меня будет другой вопрос....

Спасибо


Бурундук   (2002-03-09 23:23:00) [2]

Можно, конечно, изобрести нечто вроде
(Но я не уверен, что по скорости это тебе подойдёт)

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;


drpass   (2002-03-09 23:17:00) [3]

Измени алгоритм - например, разбей схему на логические блоки, каждый из которых будет обрабатываться отдельно. Иначе даже просчет такой схемы будет выполняться похлеще, чем рендеринг "Шрека" (кстати, кто не видел, рекомендую посмотреть :)
Матрица, насколько я понимаю, симметрична - поэтому можно хранить только ее половину.
И учти, что компилятор по умолчанию выравнивает данные по размеру машинного слова, т.е. даже тип byte физически занимает 4 байта (при этом ощутимо увеличивается быстродействие обработки).
Вообще, (мне так кажется) в твоем случае не стоит создавать какой-то новый тип данных, а выделить единый блок динамической памяти и помещать в него данные. Затем побайтно извлекать элементы и с помощью логических операций (shl, shr, and) выделять требуемые биты


Anatoly Podgoretsky   (2002-03-09 23:07:00) [4]

Abzetdin (09.03.02 22:37)
Я думаю будет серьезный проигрыщ в производительности, учитывая характер задачи, ни как не перекроет экономию памяти, даже использования байта серьезно повлияет на производительность, реалнее подумать об увеличении памяти до 512/1024 мегабайта и переход на Integer, память в наше время стоит недорого, а время дороже.


Иван Шихалев   (2002-03-09 22:53:00) [5]

Тогда лучше использовать ассемблер и двоично десятичную арифметику. Экономия, правда, будет вместо 2.6, всего в 2 раза...


Anatoly Podgoretsky   (2002-03-09 22:38:00) [6]

set of у него не получится, массив на 1000 3-битных элементов


Abzetdin   (2002-03-09 22:37:00) [7]

Такая экономия очень нужна = решается проблема размещения элементов на печатной плате, а при количестве элементов даже в 100 X 100, матрица инцидентности будет представлять собой массив
10 000 X 10 000, нетрудно подсчитать что при использовани Byte потребуется 100 MB RAM. 2,6 раз это существенная экономия.

Буду благодарен за любые предложения ...


Иван Шихалев   (2002-03-09 22:25:00) [8]

Зависит от логики работы с типом. Можно ведь и set of использовать...


Anatoly Podgoretsky   (2002-03-09 21:52:00) [9]

Да сможешь, но выгода будет ничтожная, создай лучше массив на 1000 элементов типа байт, а еще лучше интегер, хоть он и будет больше занимать места, работать будет проще и быстрее. Смело можешь не экономить до 1 000 000 элементов, всего 1 или 4 мегабайта.


panov   (2002-03-09 21:51:00) [10]

Для чего, интересно, если не секрет, настолько экономить RAM?
Максимальная экономия - в 2,6 раза, а скорость работы с данными упадет просто несравнимо.


Abzetdin   (2002-03-09 21:44:00) [11]

To Anatoly Podgoretsky
Смогу ли я упаковать, скажем, 1000 3-х битных элементов в массив типа Cardinal?
Спасибо...


Anatoly Podgoretsky   (2002-03-09 21:37:00) [12]

Abzetdin (09.03.02 21:33)
=====================================
Пожалуйста, помогите как создать в Delphi нестандартный тип? Например, известно, что минимальным целым типом является Byte (8 bit). Возможно ли определить целый тип скажем из 3-х битов и как это сделать?
Цель заключается в экономии RAM.
=====================================

У меня еще в кеше сохранился :-)

Минимальная единица хранения 1 байт.
Можно пытать вручную упаковывать данные в несколько байт, наприме в Cardinal можно упаковать 10 3-битных элементов
Какое количество данных и сколько готов отпустить под хранение?


Наверх

Титульная страница Поиск, карта сайта Написать письмо