Чому булеве значення зберігається як байт всередині комп'ютера, коли йому потрібен лише один біт


32

Я нещодавно почав вчитися писати код, і в своїй книзі я натрапив на це питання. "Чому булеве значення зберігається як байт всередині комп'ютера, коли йому потрібен лише один біт?" може хтось пролити більше світла на це питання?


10
Це не зовсім суто так. Деякі мови (наприклад, C / C ++) надають способи зберігання булевих значень як одиничні біти, якщо ці біти поєднані в один байт. Іншими словами, в C ви можете зберігати вісім булей в байті. Але мало хто використовує це, оскільки пам'ять дешева, і процесори маніпулюють даними в 8/16/32/64 бітових фрагментах.
Gort the Robot

Ця відповідь на подібне запитання - це те, що ви повинні бачити! Ви отримаєте величезну довідку там ... Ура!
Сем


Тісно пов’язані: stackoverflow.com/questions/8014161/…
Бен Лі

Відповіді:


49

Це пов'язано з тим, що процесор може легко вирішити. Наприклад, на процесорі x86 є eax(32 біт), ax(16 біт) і ah(8 біт), але немає єдиного бітового регістра. Тож для того, щоб він міг використовувати один біт, процесор повинен буде зробити читання / модифікацію / запис, щоб змінити значення. Якщо він зберігається як байт, для перевірки / зміни значення може бути використаний один читання або запис.

Крім того, можна поцікавитися, чи було б краще використовувати один біт проти повного байту, адже байт витратить 7 біт. Якщо простір не є обмеженням, слід перейти на байт, тому що, принаймні, x86, і я думаю, що інші, зазвичай є інструкція швидко встановити / очистити bool, який набагато швидше, ніж читання / зміна / запис одного біта . З особистих вимірювань я бачив, що метод читання / мод / запис на 5 разів повільніше, ніж метод єдиної інструкції.


6
Єдине слово, яке вам не вистачає, - "Прикордонне вирівнювання".
Маной Р

3
З іншого боку, я бачив у 2 рази швидкість використання окремих біт, імовірно, завдяки кращому використанню кешу з меншим набором даних.
Майкл Боргвардт

5

Як пояснює @ barrem23 , дані повинні бути адресовані , а найменша межа звичайних архітектур - байт.

Але оскільки це питання позначено як , можливо, варто зазначити, що std::vector<bool>він спеціалізований для того, щоб окремі елементи могли зберігатися як біти . Це дозволить заощадити місце, пожертвувавши деякою функціональністю (наприклад, std::searchможе не працювати).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.