Сведения о вопросе

Getthesound

19:56, 29th August, 2020

Теги

c++   performance   bitsets    

Когда использовать STL битовых наборов вместо отдельных переменных?

Просмотров: 483   Ответов: 4

В какой ситуации мне было бы более уместно использовать битовый набор (контейнер STL) для управления набором флагов, а не объявлять их как ряд отдельных переменных (bool)?

Получу ли я значительный прирост производительности, если буду использовать битовый набор для 50 флагов, а не 50 отдельных переменных bool?



  Сведения об ответе

+-*/

06:28, 13th August, 2020

Ну, 50 значений, как bitset займет 7 байт, в то время как 50 значений как значений, возьмем 50 байт. В наши дни это не так уж и важно, так что использование була, вероятно, нормально.

Однако одно место, где битовый набор может быть полезен, - это если вам нужно много передавать эти були, особенно если вам нужно вернуть набор из функции. Используя битовый набор, Вы получаете меньше данных,которые должны быть перемещены по стеку для возврата. С другой стороны, вы можете просто использовать ссылки вместо этого и иметь еще меньше данных для передачи. :)


  Сведения об ответе

VCe znayu

10:01, 7th August, 2020

std::bitset даст вам дополнительные очки, когда вам нужно сериализовать / десериализовать его. Вы можете просто записать его в поток или прочитать из потока с ним. Но, конечно, отдельные булы будут быстрее. В конце концов, они оптимизированы для такого использования, в то время как битовый набор оптимизирован для пространства и все еще включает вызовы функций. Это никогда не будет быстрее, чем отдельные булы.

Bitset

  • Очень эффективный космос
  • Менее эффективен из-за скрипа битами
  • Обеспечивает сериализацию / де-сериализацию с помощью op<< и op>>
  • Все биты упакованы вместе: вы будете иметь флаги в одном месте.

Отдельные кабинки

  • Очень быстрый
  • Булы не упакованы вместе. Они будут где-то членами клуба.

Решайте на основании фактов. Я лично использую std::bitset для некоторых не-критических характеристик производительности и использую bools, если у меня есть только несколько bools (и, таким образом, это вполне доступно для обзора), или если мне нужна дополнительная производительность.


  Сведения об ответе

#hash

19:15, 2nd August, 2020

RE @Wilka:

На самом деле, битовые наборы поддерживаются C/C++ таким образом, что вам не нужно делать свою собственную маскировку. Я не помню точного синтаксиса, но это что-то вроде этого:

struct MyBitset {
  bool firstOption:1;
  bool secondOption:1;
  bool thirdOption:1;
  int fourBitNumber:4;
};

Вы можете ссылаться на любое значение в этой структуре, просто используя точечную нотацию, и правильные вещи произойдут:

MyBitset bits;
bits.firstOption = true;
bits.fourBitNumber = 2;

if(bits.thirdOption) {
  // Whatever!
}

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


  Сведения об ответе

screen

06:51, 19th August, 2020

Это зависит от того, что вы подразумеваете под 'performance gain'. Если вам нужно только 50 из них, и у вас не так мало памяти, то отдельные булы-это почти всегда лучший выбор, чем набор бит. Они заберут больше памяти, но булы будут гораздо быстрее. Битовый набор обычно реализуется в виде массива int (булы упаковываются в эти int). Таким образом, первые 32 була (бита) в вашем битовом наборе будут занимать только один 32-битный int, но для чтения каждого значения вам нужно сначала выполнить некоторые побитовые операции, чтобы замаскировать все значения, которые вы не хотите. E.g. чтобы прочитать 2-й бит битового набора, вам необходимо:

  1. Найти интервал, который содержит бит, который вы хотите (в данном случае, это первый инт)
  2. Побитовое и это int с '2' (т. е. значение & 0x02), чтобы узнать, установлен ли этот бит

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

NOTE: a std::vector of bool обычно имеет специализацию на использовании эквивалента битового набора, что делает его намного меньше и также медленнее по тем же причинам. Поэтому, если скорость является проблемой, вам будет лучше использовать вектор char (или даже int), или даже просто использовать старый школьный массив bool.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться