Основи програмування на С ++ для початківців

Бітові поля в С ++

У мові С ++ є можливість задавати елементам структур певну кількість пам'яті в бітах. Наприклад, якщо необхідно створити структуру даних, що відповідає розміру регістра в будь-якому пристрої. типом елемента (його називають двійкового полем) такої структури може бути целочисленное (найчастіше типу непідписаний) или перелічуваних (enum).

Синтаксично бітове поле в структурі визначається наступним чином:
бітові поля з ++, структури в с ++ для початківцівНаприклад:

Ми визначили структуру, в якій змінні будуть займати вказану кількість біт. 2 + 2 + 4 дає 8 біт (ми вирівняли до розміру байта). Якщо в цю структуру дописати ще непідписаний short п'ятий : 5; – вже буде задіяно 2 байта. У другому байті природно буде сміття 8 – 5 = 3 біти, які будуть незатребуваними.

На відміну від об'єднань (union) розмір бітових полів варіюється, в залежності від того, скільки біт програміст замовив. якщо замовлено 7 біт (скажімо дві змінні по 3 біти, і одна – 1 біт), то С ++ відведе один байт (8 біт) під ці три змінні.

Якщо програміст замовить 11 біт, то С ++ відведе два байта (16 біт). Причому в другому байті будуть задіяні тільки 5 біт, а решта швидше за все будуть, як непотрібний хвіст. Тому при описі бітових полів слід враховувати таке “вирівнювання” до байта. Тобто,. розподіляти в ньому змінні так, щоб кожен біт був затребуваний. Для вирівнювання займаної пам'яті можна використовувати неіменовані бітові поля.

Наведемо ще один короткий приклад, в якому бітові поля відводяться під дату і час для демонстрації цієї технології.

Результат:

бітові поля з ++, структури в с ++ для початківців

Як бачите, бітові поля зберігають дату і час. Займає ця структура 6 байт, хоча для неї вистачить і п'яти. І на те є свої причини: сам компілятор може вирівнювати відведену пам'ять до парного числа байтів.

Наприклад якщо ми замовили 18 біт, компілятор відведе нам не 3 байта, а 4, враховуючи що процесор любить працювати з байтами, а не з битами. Принаймні зберігати в пам'яті або своїх регістрах процесор вважає за краще не біти, а саме байти. Згідно з його розрядності: x32 корми 4 байта, x64 вже 8 байт. Нехай навіть з цих байт робота йде тільки з одним з них, інші все одно будуть підтягуватися.

невеликий підсумок: Бітові поля в структурах зазвичай використовуються в низкоуровневом програмуванні, коли робота йде зі значеннями, здатними займати не байти, а окремі біти (з огляду на те, що значення невеликі).

6 думки про "Бітові поля в С ++

  1. дезінформуєте людей. Розмір
    {
    непідписаних короткий перші : 2;
    непідписаних короткий другий: 2;
    непідписаних короткий третій : 4;
    } одно не 1 ʙajtu, а 2

      1. Нет, він все вірно сказав, 2 байта.
        Якщо поставити unsigned char, то один байт, але ось зараз два. Повір у будь-який ide.
        А якщо int, те 4; і аналогічно для восмібайтових.

        тест структура{
        непідписаний довго довго першим : 64;
        непідписані символ другої: 8;
        }; – має розмір в 16 байт замість очікуваних тобою 9.
        Він вирівнює за розміром типу максимального розміру, по видимому.

    1. Вирівняти
      пробувати
      #пакет прагми(push,1)
      структура typedef{
      непідписаних короткий перші :2;
      непідписаних короткий другий:2;
      непідписаних короткий третій :4;
      } Foo;
      #поп-прагма()
      Хоча і так 1 байт в мінгв мсвц і гцц і смакує

  2. Тут деякого дуже важливого уточнення

    Використання такого механізму уповільнює програму

    Це пов'язано з тим, що буде згенеровано код компілятором для маніпуляцій з даними(це будуть побітові операції), все залежить від реалізації компілятора(перевіряйте його роботу в .obj файлі(якщо не знаєте про те, що це, то дивіться як компілюється прога))
    У нинішній час – це може бути не значним приростом часу, але якщо частота використання таких даних зашкалює, то ми отримаємо, возможно, круту прогу, що вимагає мало ОЗУ, але точно повільну прогу

    Так що користуйтеся акуратніше і зважуйте своє рішення

  3. Сергій, вчуся я Вас, плачу гроші не Вам. Дам рекомендацію Вам, щоб Ви вчили. Ви добрий вчитель. повага до Вас повна

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *