Битовые поля в C и C ++: где они используются?

0

Я работаю с C и C++ в течение некоторого времени.

Изучая основы, вы можете столкнуться с такими интересными вещами, как бит-поля. Использование бит-полей в практике программирования носит как-то спорный характер.

В каких ситуациях это низкоуровневое использование функций дает реальную пользу, и есть ли конкретные примеры использования полей бит правильно?

  • 1
    Попробуйте написать столбчатую базу данных переменного размера.
  • 1
    Это немного широко. Но низкоуровневая сериализация в зависимости от платформы может извлечь выгоду из битовых полей, как и большие структуры данных в памяти, кеш-ориентированная работа с памятью и т. Д.
Показать ещё 8 комментариев
Теги:
design
bit-fields

4 ответа

1
Лучший ответ

Существует несколько вариантов использования битных полей, даже на современных машинах.

Первое - это когда вы обрабатываете логику уровня регистра. Это часто встречается при настройке режимов и работе определенных аппаратных средств. Это особенно характерно для встроенных устройств. Например, на устройствах 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++

Итак, одним словом: при разговоре напрямую с оборудованием или в сетевом коде.

2

При работе со встроенными системами и микроконтроллерами отдельные биты в регистре могут быть связаны с настройкой процессора или вводом/выводом. Использование битовых полей позволяет обрабатывать эти отдельные биты по имени вместо выполнения побитовых операций по всему регистру.

Это в основном эстетическая функция, но может повысить читаемость кода в некоторых приложениях.

  • 0
    За исключением того, что они не работают для этого, если ваш компилятор не указывает иначе. (Который, конечно, связывает вас с одним конкретным компилятором. Но большинство встроенных систем в любом случае будут более или менее привязаны к конкретному компилятору.)
1

В дополнение к другим ответам, в некоторых сценариях использование битовых полей может улучшить как использование памяти, так и производительность.

Сохраняйте память, складывая вместе свойства, которые требуют нескольких бит, чтобы выразить диапазон возможных значений. Зачем ставить 8 свойств bool как 8 членов bool, когда один байт дает возможность хранить 8 булевых значений в каждом бите - вместо 8 байтов вы используете только 1, 7 байт, сохраненных довольно значительным. Естественно, вы обычно использовали 32, 64-битные или более широкие битовые поля. У меня есть аналогичный сценарий с множеством объектов с большим количеством свойств, которые могут быть выражены в одном или нескольких битах, а для случаев с большим количеством объектов (в миллионах) экономия памяти действительно значительна.

Увеличьте производительность - хотя битовые поля имеют небольшое ограничение производительности (чтобы получить доступ к фактическому значению при смене и маскировке), эти операции выполняются очень быстро. Упаковка большего количества данных и потерять меньше бит может дать вам лучшую эффективность кеша, что может привести к увеличению производительности, которое больше, чем штраф за доступ к полям бит. Мало того, что доступ к отдельным битам может быть быстрее, чем выбор другой линии из кеша, и более вероятно найти данные в кеше, если они упакованы, но это уменьшит количество кэша, оставив больше доступного пространства для других процессов.

1

Вероятно, мало пользы для битных полей на современной высокопроизводительной машине, но для небольших машин они могут быть очень полезны для экономии памяти, если у вас большие массивы структур. Однако, помимо экономии памяти, для них нет никакой пользы.

  • 0
    Речь идет не только об экономии памяти (на самом деле это, вероятно, один из наименее распространенных видов использования). Регистрация битовых полей для SoC и микроконтроллеров более вероятна. Например, этот заголовок PIC16 широко использует битовые поля, как и заголовки, специфичные для отдельных деталей, для большинства микроконтроллеров и SoC.
  • 0
    Встроенная сборка все еще распространена на современных процессорах. Например, MATLAB широко использует оптимизацию под конкретные платформы. В некотором коде явно указываются конкретные регистры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню