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





Итак, 50 bools в качестве битового набора займут 7 байтов, а 50 bools в качестве bools займут 50 байтов. В наши дни это не так уж и важно, поэтому использование bools, вероятно, нормально.
Однако есть одно место, где битовый набор может быть полезен, - это если вам нужно много передавать эти bools, особенно если вам нужно вернуть набор из функции. Используя битовый набор, вы получаете меньше данных, которые нужно перемещать в стеке для возврата. Опять же, вы можете просто использовать refs и иметь еще меньше данных для передачи. :)
Это зависит от того, что вы подразумеваете под «приростом производительности». Если вам нужно всего 50 из них, и у вас не мало памяти, тогда отдельные bools почти всегда лучший выбор, чем bitset. Они займут больше памяти, но булы будут намного быстрее. Битовый набор обычно реализуется как массив целых чисел (логические значения упаковываются в эти целые числа). Таким образом, первые 32 bool (бита) в вашем битовом наборе будут занимать только один 32-битный int, но для чтения каждого значения вам нужно сначала выполнить несколько побитовых операций, чтобы замаскировать все значения, которые вам не нужны. Например. чтобы прочитать 2-й бит битового набора, вам необходимо:
Однако, если память является узким местом и у вас много bools, использование битового набора может иметь смысл (например, если ваша целевая платформа - мобильный телефон или это какое-то состояние в очень загруженной веб-службе)
ПРИМЕЧАНИЕ: std :: vector для bool обычно имеет специализацию для использования эквивалент битового набора, что делает его намного меньше и медленнее по тем же причинам. Поэтому, если скорость является проблемой, вам лучше использовать вектор char (или даже int) или даже просто использовать массив bool старой школы.
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 бит больше, чем определяемые вами данные (ее размер всегда равен минимальному количеству байтов, необходимых для хранения данных, которые вы определили).
std :: bitset даст вам дополнительные очки, когда вам нужно сериализовать / десериализовать его. Вы можете просто записать его в поток или прочитать с его помощью. Но, конечно, отдельные буллы будут быстрее. В конце концов, они оптимизированы для такого использования, в то время как битовый набор оптимизирован для пространства и по-прежнему задействует вызовы функций. Это никогда не будет быстрее, чем отдельные буллы.
op<< и op>>Определитесь с фактами. Лично я бы использовал std::bitset для некоторых критических проблем, не связанных с производительностью, и использовал бы bools, если у меня либо всего несколько bool (и, следовательно, он вполне доступен для обзора), либо если мне нужна дополнительная производительность.
Я бы добавил возможность использования побитового оператора или для комбинирования наборов флагов в качестве огромного выигрыша для битового набора.
В отдельном случае с bool вы можете использовать битовое поле, чтобы не тратить впустую 50 байтов.