Я работаю с C и C++ в течение некоторого времени.
Изучая основы, вы можете столкнуться с такими интересными вещами, как бит-поля. Использование бит-полей в практике программирования носит как-то спорный характер.
В каких ситуациях это низкоуровневое использование функций дает реальную пользу, и есть ли конкретные примеры использования полей бит правильно?
Существует несколько вариантов использования битных полей, даже на современных машинах.
Первое - это когда вы обрабатываете логику уровня регистра. Это часто встречается при настройке режимов и работе определенных аппаратных средств. Это особенно характерно для встроенных устройств. Например, на устройствах Arduino логика "PinMode" в основном устанавливает отдельные биты с высоким или низким, чтобы указать, находится ли цифровой контакт ввода/вывода в режиме "вход" или "выход".
http://arduino.cc/en/Reference/pinMode
Во-вторых, при написании оптимизированного, встроенного ассемблерного кода в программе C/C++. Бывают случаи, когда вы хотите использовать аппаратные оптимизированные инструкции, чтобы максимально ускорить выполнение программы:
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
Конечным общим примером является при написании драйверов пакетов или реализации определенных протоколов. Недавно я только что разместил вопрос об этом, где оказалось, что я использовал 32-битную переменную вместо 8-битной переменной, состоящей из бит-полей, что вызывало мой разрыв кода:
Основной клиент NTP в Windows на Visual C++
Итак, одним словом: при разговоре напрямую с оборудованием или в сетевом коде.
При работе со встроенными системами и микроконтроллерами отдельные биты в регистре могут быть связаны с настройкой процессора или вводом/выводом. Использование битовых полей позволяет обрабатывать эти отдельные биты по имени вместо выполнения побитовых операций по всему регистру.
Это в основном эстетическая функция, но может повысить читаемость кода в некоторых приложениях.
В дополнение к другим ответам, в некоторых сценариях использование битовых полей может улучшить как использование памяти, так и производительность.
Сохраняйте память, складывая вместе свойства, которые требуют нескольких бит, чтобы выразить диапазон возможных значений. Зачем ставить 8 свойств bool как 8 членов bool
, когда один байт дает возможность хранить 8 булевых значений в каждом бите - вместо 8 байтов вы используете только 1, 7 байт, сохраненных довольно значительным. Естественно, вы обычно использовали 32, 64-битные или более широкие битовые поля. У меня есть аналогичный сценарий с множеством объектов с большим количеством свойств, которые могут быть выражены в одном или нескольких битах, а для случаев с большим количеством объектов (в миллионах) экономия памяти действительно значительна.
Увеличьте производительность - хотя битовые поля имеют небольшое ограничение производительности (чтобы получить доступ к фактическому значению при смене и маскировке), эти операции выполняются очень быстро. Упаковка большего количества данных и потерять меньше бит может дать вам лучшую эффективность кеша, что может привести к увеличению производительности, которое больше, чем штраф за доступ к полям бит. Мало того, что доступ к отдельным битам может быть быстрее, чем выбор другой линии из кеша, и более вероятно найти данные в кеше, если они упакованы, но это уменьшит количество кэша, оставив больше доступного пространства для других процессов.
Вероятно, мало пользы для битных полей на современной высокопроизводительной машине, но для небольших машин они могут быть очень полезны для экономии памяти, если у вас большие массивы структур. Однако, помимо экономии памяти, для них нет никакой пользы.