Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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: Суть программы в этом и заключается, т.е. процесс размещения происходит с использование ресурсов локальной сети, а информация передается сокетами. В связи с этим у меня будет другой вопрос....

Спасибо




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.018 c
1-80457           Neolord               2002-03-08 03:45  2002.03.25  
Как убрать паузу перед началом повтора(клава)


14-80675          Чужая                 2002-02-11 06:10  2002.03.25  
О мужском поле


7-80697           a1                    2001-12-24 13:10  2002.03.25  
есть ли такая возможность заставить CDROM


7-80711           Andrey196             2001-12-23 20:06  2002.03.25  
Как программно поменять разрешение экрана


3-80432           alextov               2002-02-26 15:22  2002.03.25  
Всегда видимое первое поле в DBGrid e, независимо от скроллинга