13.8. Битовое поле – член, экономящий память
13.8. Битовое поле – член, экономящий память
Для хранения заданного числа битов можно объявить член класса специального вида, называемый битовым полем. Он должен иметь целый тип данных, со знаком или без знака:
class File {
// ...
unsigned int modified : 1; // битовое поле
};
После идентификатора битового поля следует двоеточие, а за ним – константное выражение, задающее число битов. К примеру, modified – это поле из одного бита.
Битовые поля, определенные в теле класса подряд, по возможности упаковываются в соседние биты одного целого числа, делая хранение объекта более компактным. Так, в следующем объявлении пять битовых полей будут содержаться в одном числе типа unsigned int, ассоциированном с первым полем mode:
typedef unsigned int Bit;
class File {
public:
Bit mode: 2;
Bit modified: 1;
Bit prot_owner: 3;
Bit prot_group: 3;
Bit prot_world: 3;
// ...
};
Доступ к битовому полю осуществляется так же, как к прочим членам класса. Скажем, к битовому полю, являющемуся закрытым членом класса, можно обратиться лишь из функций-членов и друзей этого класса:
void File::write()
{
modified = 1;
// ...
}
void File::close()
{
if ( modified )
// ... сохранить содержимое
}
Вот простой пример использования битового поля длиной больше 1 (примененные здесь побитовые операции рассматривались в разделе 4.11):
enum { READ = 01, WRITE = 02 }; // режимы открытия файла
int main() {
File myFile;
myFile.mode |= READ;
if ( myFile.mode & READ )
cout "myFile.mode is set to READ ";
}
Обычно для проверки значения битового поля-члена определяются встроенные функции-члены. Допустим, в классе File можно ввести члены isRead() и isWrite():
inline int File::isRead() { return mode & READ; }
inline int File::isWrite() { return mode & WRITE; }
if ( myFile.isRead() ) /* ... */
С помощью таких функций-членов битовые поля можно сделать закрытыми членами класса File.
К битовому полю нельзя применять оператор взятия адреса (&), поэтому не может быть и указателя на подобные поля-члены. Кроме того, полю запрещено быть статическим членом.
В стандартной библиотеке C++ имеется шаблон класса bitset, который облегчает манипуляции с битовыми множествами. Мы рекомендуем использовать его вместо битовых полей. (Шаблон класса bitset и определенные в нем операции рассматривались в разделе 4.12.)
Упражнение 13.17
Перепишите примеры из этого подраздела так, чтобы в классе File вместо объявления и прямого манипулирования битовыми полями использовался класс bitset и его операторы.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Поле для ввода пароля
Поле для ввода пароля Чтобы создать поле для ввода пароля, задаем значение атрибута type="password". Особенность этого поля в том, что все введенные буквы закрываются звездочками (или точками, в зависимости от системы) и увидеть вводимый пароль невозможно.Вместе с этим полем
Поле ввода
Поле ввода Поле ввода — наиболее распространенный элемент управления в Web-формах — создается с помощью одинарного тега <INPUT>:<INPUT [TYPE="text"] [VALUE="<изначальное значение>"] [SIZE="<размер>"] [MAXLENGTH="<максимальное количество символов>"] [DISABLED] [TABINDEX="<номер в порядке
Поле ввода
Поле ввода Поле ввода — наиболее распространенный элемент управления в Web-формах — создается с помощью одинарного тега <INPUT>:<INPUT [TYPE="text"] [VALUE="<изначальное значение>"] [SIZE="<размер>"] [MAXLENGTH="<максимальное количество символов>"] [DISABLED] [TABINDEX="<номер в порядке
Поле ввода пароля
Поле ввода пароля Поле ввода пароля ничем не отличается от обычного поля ввода за тем исключением, что вместо вводимых символов в нем отображаются точки. Такие поля ввода широко применяют для запроса паролей и других конфиденциальных данных.Поле ввода пароля также
6.13.2 Поля назначения, поле источника и поле протокола
6.13.2 Поля назначения, поле источника и поле протокола Наиболее важными полями заголовка являются: Destination IP Address (IP-адрес назначения), Source IP Address (IP-адрес источника) и Protocol (протокол).IP-адрес назначения позволяет маршрутизировать датаграмму. Как только она достигает точки
6.14.1 Поле идентификации
6.14.1 Поле идентификации Поле идентификации содержит 16-разрядное число, помогающее хосту назначения распознать фрагмент датаграммы при
6.14.2 Поле Флагов
6.14.2 Поле Флагов Поле флагов содержит три бита: Бит 0 Бит 1 Бит 2 0=Зарезервировано 0=Можно фрагментировать 1=Нельзя фрагментировать 0=Последний фрагмент (Last) 1=Есть еще фрагменты (More) Бит 0 зарезервирован, но должен иметь значение 0. Отправитель может указать в следующем
R.5.5 Операции указатель-на-член
R.5.5 Операции указатель-на-член Операции указатель-на-член применяются слева направо.выражение-pm: выражение-приведения выражение-pm .* выражение-приведения выражение-pm -›* выражение-приведенияБинарная операция .* связывает свой второй операнд, который должен иметь тип
R.18.3.4 Приведение указателей на функцию-член
R.18.3.4 Приведение указателей на функцию-член Указатель на функцию-член некоторого объекта можно привести к указателю на какую-то другую функцию, например (int (*) ())p-›f. Результирующий указатель будет настроен на функцию, вызов которой будет происходить с помощью обращения к
Поле поиска
Поле поиска Помимо удаления кнопки Поиск, существует несколько возможностей настройки работы поля поиска, отображаемого в меню Пуск. Все они основаны на параметрах REG_DWORD-типа, расположенных в ветви реестра HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer:• NoStartMenuSearchComm – если
Поле брани
Поле брани «Мы матом не ругаемся, мы на нем разговариваем» - сия полушутливая фраза, похоже, уже перестала восприниматься как анекдот. Чтобы убедиться в этом, не обязательно наступать двумя ногами на новенький ботинок какому-нибудь верзиле в общественном транспорте или
В ПОЛЕ ЗРЕНИЯ
В ПОЛЕ ЗРЕНИЯ Часто бывает так, что новость - это лишь вершина айсберга, тогда как для понимания полной картины происходящего надо знать множество мелких подробностей. В этом разделе наши авторы вместе с известными экспертами вскрывают подоплеку
СОФТЕРРА: Память на лица, или Лица на память
СОФТЕРРА: Память на лица, или Лица на память Автор: Алексей КлимовВышла девятая версия ACDSee. Судя по объему нововведений, это не «Девятый вал» Айвазовского [Иван Айвазовский, «Девятый вал». 1850 г] и даже не «9 рота» Бондарчука [Федор Бондарчук, «9 рота». 2005 г]. Поэтому в обзоре
Антенное поле чудес
Антенное поле чудес Автор: Юрий РомановВоспользовавшись любезным приглашением заместителя директора Радиоастрономического института академика НАН Украины А. А. Коноваленко [За что хочу выразить ему благодарность, а также за доброжелательную помощь в подготовке