Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.17;
Скачать: [xml.tar.bz2];

Вниз

Тип размером в 3 бита   Найти похожие ветки 

 
akvilon   (2003-02-09 15:09) [0]

Мастера, подскажите пожалуйста, как задать тип с размером
выделяемой памяти не кратным байту.


 
Anatoly Podgoretsky   (2003-02-09 15:20) [1]

TBits


 
Романов Р.В.   (2003-02-09 15:47) [2]

Никак. Минимум 1 байт.


 
}{enon   (2003-02-09 19:20) [3]

2 Романов Р.В.

А что, Boolean тоже 1 байт?


 
Anatoly Podgoretsky   (2003-02-09 19:40) [4]

Boolean 1 бит, но памяти занимает минимум 1 байт, так понятно?


 
}{enon   (2003-02-09 19:45) [5]

2 Anatoly Podgoretsky

Понятно-то понятно, только непонятно почему память впустую расходуется.


 
Polevi   (2003-02-09 20:02) [6]

это в орешник


 
___ALex___   (2003-02-09 20:17) [7]

потому что единица адресуемой информации - байт


 
Anatoly Podgoretsky   (2003-02-09 20:30) [8]

А ты еще сохдай файл на диске с кластером 64 кб, может тогда поймешь.


 
dmk   (2003-02-09 20:44) [9]

Можно описать свою переменную, но неявным образом.
Более подробно см. алгоритм LZW компрессии/декомпрессии.
Там используются массивы состоящие из данных c переменной
битностью.
Но если нужна всего одна ячейка, то минимум это байт.

обидно да ... :)


 
Романов Р.В.   (2003-02-09 21:25) [10]


>}{enon © (09.02.03 19:45)
> только непонятно почему память впустую расходуется

Какраз не расходуется, а наоборот экономится. Машинная команда проверки значения логической переменной помещается в 2 байта. А теперь представьте что мы в 1 байт поместили 8 логических переменных (для экономии :) Теперь чтобы проверить значение переменной нужно знать в каком она бите находится т.е. к двум байтам команды нужно добавить 1 байт в котором хранится номер бита.
Подсчитаем "экономию" при использовании 8 логических переменных.
Предположим что каждую переменную мы проверяем в 2 местах программы.
Тогда по "экономичному варианту" 1 байт на переменные плюс 8 * 2 * 3 = 48 байт на команды. Итого 49 байт.
А теперь реальный расход памяти 8 байт на переменные и 8 * 2 * 2 = 32 байта на команды. Итого 40 байт.

А если учесть еще то что 2 байтная команда выполняется быстрее то получим многомиллионную экономию "машиночасов".
И таких плюсов много.

Вот она экономия то где :)


 
Saracin   (2003-02-10 00:33) [11]

Есть такое понятие упакованные данные. Незнаю насчет паскаля с его побитовыми операциями (пишу на С) но суть заключается в
том что, в одном байте ты можешь хранишь значения 8-ми, битовых переменных, используя маски типа 0x10 (00010000) или 0x02 (00000010) ты выделяешь значение соответсвующей переменной (в первом случае (4-ой справа) во втором случае (2-ой слева) и логически умножаем байта на маску выделяешь значения нужной переменой. Это удобно для хранения скажем булевого массива. Потом ты можешь использовать переменные размером не 1 бит, а скажем 3 переменные a,b,c где sizeof(a)==1,sizeof(b)==2,sizeof(c)==5, используя маски типа (для b) 0x60 01100000 (для с) 0x1F 00011111. Плюсы - мало памяти, минусы очень медленно. т.к. чтобы сложить скажем c = a + b; тебе предется выделить сначала a потом b, сложить и потом результат ипользуя маску засунить в c.


 
ALex44   (2003-02-10 00:53) [12]

Strogo govorya, Boolean obychno zanimaet ne odin, a chetyre bytes, t.k. dannye po umolchaniyu vyravnivayutsya. (Skoro, navernoe, budet 8.) Esli rech" idet ob odnoj peremennoj, to glupo economit" (bol"she mesta na code ujdet). Esli problema ser"eznaya (massive is millionov 3-bitnyh dannyh), to pridetsya delat" samomu (vychislyat" smeshenie, izvlekat" po maske, i sdvigat").

Da, esli rech" idet o neskol"kih Boolean, to eto prosto set. Esli ih mnogo, to est" TBitArray (?)


 
Saracin   (2003-02-10 00:54) [13]

Упакованные данные используются (чаще всего) при программировании микрокантролеров, т.к. от размера используемой памяти зависит себистоимость железяки, ну в больщенстве задач скорость не так нужна.
Забыл уточнить, если ты все же захочешь с этим заморочится, то советую (настоятельно) использовать 32-разрядные маски, т.к. все таки 32-разрядная система. Ты можешь сказать типа все равно при c = a+b три переменные нужны, типа потом буду упаковывать, но на момент операции (+) нужно 3 переменные. Не совсем верн если юзать 32-разрядные маски, то можешь под a,b,c выделить 3 32-разрядных регистра общего назначения типа (EAX,EDX,ECX - например) и там все вытворять с сдвишками и умнажением на маску.


 
Saracin   (2003-02-10 00:58) [14]

>ALex44 (10.02.03 00:53)
Выравниванием у тебя будет как надо по словам, но внутри этого слова утябя может хранится все что тебе нужно.


 
Saracin   (2003-02-10 01:00) [15]

:) Да еще упакованные даные разумно и предпочтительно использовать в сетевых протоколах. Ну например тебе надо передать из процесса P1 в P2 значения 3 переменых, так вот использование при этом механизма упакованных данных, это хорошие тон.



Страницы: 1 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.009 c
7-53303
SPIRIT
2002-12-17 23:24
2003.02.17
Маска формы


1-53110
Igorek
2003-02-05 17:40
2003.02.17
Bold font для пункта меню редактора компонента


1-53100
Sem
2003-02-07 09:31
2003.02.17
Файлы


1-52845
158963
2003-02-06 12:05
2003.02.17
Помогите с алгоритмом пожалуйста


1-53083
andrei
2003-02-06 19:06
2003.02.17
Delphi 6 можно из Imedg сохранить в gif формат





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский