Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-80632
Zerul
2002-01-08 15:14
2002.03.25
telnet


1-80585
KvORubin
2002-03-08 15:10
2002.03.25
Как мне вставить свой курсор в форму !!!!


3-80396
Мефодий
2002-02-25 17:54
2002.03.25
Проблема с использованием Locate


14-80692
McSimm
2002-02-10 17:41
2002.03.25
А пирушка уже удалена?


1-80602
Starkom
2002-03-11 13:34
2002.03.25
Проблема с TStringList.Duplicates в ЛистБоксе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский