русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Розрядні поля


Дата додавання: 2014-11-28; переглядів: 1113.


Коли з пам'яттю справді скрутно, то може з'явитися потреба помістити декілька об'єктів в єдине машинне слово; одним із поширених використань, наприклад, є набір однобітних прапорців у додатках на зразок таблиці символів компілятора. Формати даних нав'язані ззовні, як у випадку інтерфейсів до апаратного устаткування, також часто вимагають здатності одержати частини слова.

Уявіть фрагмент компілятора, що маніпулює таблицею символів. Кожний ідентифікатор у програмі має певну інформацію, пов'язану з ним, наприклад чи це ключове слово чи ні, чи зовнішнє чи/або статичне, і так далі. Найбільш компактним способом закодувати таку інформацію, це встановити однобітний прапорець на єдиному char або int.

Звичний спосіб за допомогою якого це можна зробити, це означити набір «маск», що відповідатимуть слушним позиціям бітів, як наприклад

#define KEYWORD 01

#define EXTRENAL 02

#define STATIC 04

або

enum { KEYWORD = 01, EXTERNAL = 02, STATIC = 04 };

Числа повинні бути в степені двійки. Після цього доступ до бітів складатиметься з їхнього «перебирання» шляхом зсуву, маскування, і доповнювальних операторів описаних в Розділі 2.

Певні ідіоми зустрічаються досить часто:

flags |= EXTERNAL | STATIC;

вмикає біти EXTERNAL і STATIC у flags, тоді як

flags &= ~(EXTERNAL | STATIC);

вимикає їх, і

if ((flags & (EXTERNAL | STATIC)) == 0) ...

є істинним, якщо обидва біти вимкнено.

Незважаючи на легкість засвоєння цих ідіом, як альтернатива C пропонує можливість безпосереднього означення та доступу полів всередині слова замість порозрядних логічних операторів. Розрядне поле, або просто «поле» для скорочення, являється набором суміжних бітів всередині єдиної, визначеної реалізацією пам'ятової одиниці, яке ми називаємо «словом». Синтаксис означення полів і доступу до них основується на притаманному структурам. Наприклад, означення #define вище можна замінити означеннями трьох полів:

struct {

unsigned int is_keyword : 1;

unsigned int is_extern : 1;

unsigned int is_static : 1;

} flags;

Це означує змінну під назвою flags, яка містить три 1-бітних поля. Число, яке слідує за двокрапкою відображає ширину поля в бітах. Поля оголошено як unsigned int, щоб упевнитися, що це беззнакові величини.

Звертання до окремих полів таке саме як до інших членів структур: flags.is_keyword,flags.is_extern тощо. Поля містять ніби маленькі цілі і можуть брати участь в арифметичних операціях так само як інші цілі числа. Таким чином, попередній приклад більш природньо розписати як

flags.is_extern = flags.is_static = 1;

щоб увімкнути біти,

flags.is_extern = flags.is_static = 0;

щоб вимкнути їх, і

if (flags.is_extern == 0 && flags.is_static == 0)

...

щоб перевірити.

Майже все, що пов'язано з полями залежить від втілення. Чи може поле виходити за межі слова залежить від реалізації. Поля не обов'язково повинні мати назви; безіменні поля (тільки двокрапка та ширина) застосовуються як заповнювачі. Щоб добитися вирівнювання з наступною межею слова, можна використати спеціальну ширину поля 0.

Присвоєння значення полям відбувається з ліва на право на одних машинах, і з права на ліво на інших. Це означає, що незважаючи на те, що поля корисні для утримування внутрішньо-означених структур даних, слід уважно розглянути питання який кінець йде першим, розбираючи зовнішньо-означені дані; програми, які залежать від таких речей не є портабельними. Поля можна оголосити тільки як int; для портабельності явно вкажіть signed (знакові) або unsigned(беззнакові). Вони не являються масивами і не мають адрес, оператор & застосувати неможливо.


<== попередня лекція | наступна лекція ==>
Сполуки | Стандартний ввід і вивід


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн