Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Когда использовать STL битовых наборов вместо отдельных переменных?
В какой ситуации мне было бы более уместно использовать битовый набор (контейнер STL) для управления набором флагов, а не объявлять их как ряд отдельных переменных (bool)?
Получу ли я значительный прирост производительности, если буду использовать битовый набор для 50 флагов, а не 50 отдельных переменных bool?
Ну, 50 значений, как bitset займет 7 байт, в то время как 50 значений как значений, возьмем 50 байт. В наши дни это не так уж и важно, так что использование була, вероятно, нормально.
Однако одно место, где битовый набор может быть полезен, - это если вам нужно много передавать эти були, особенно если вам нужно вернуть набор из функции. Используя битовый набор, Вы получаете меньше данных,которые должны быть перемещены по стеку для возврата. С другой стороны, вы можете просто использовать ссылки вместо этого и иметь еще меньше данных для передачи. :)
std::bitset даст вам дополнительные очки, когда вам нужно сериализовать / десериализовать его. Вы можете просто записать его в поток или прочитать из потока с ним. Но, конечно, отдельные булы будут быстрее. В конце концов, они оптимизированы для такого использования, в то время как битовый набор оптимизирован для пространства и все еще включает вызовы функций. Это никогда не будет быстрее, чем отдельные булы.
Bitset
- Очень эффективный космос
- Менее эффективен из-за скрипа битами
- Обеспечивает сериализацию / де-сериализацию с помощью
op<<иop>> - Все биты упакованы вместе: вы будете иметь флаги в одном месте.
Отдельные кабинки
- Очень быстрый
- Булы не упакованы вместе. Они будут где-то членами клуба.
Решайте на основании фактов. Я лично использую std::bitset для некоторых не-критических характеристик производительности и использую bools, если у меня есть только несколько bools (и, таким образом, это вполне доступно для обзора), или если мне нужна дополнительная производительность.
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 бит больше, чем данные, которые вы определяете (ее размер всегда является минимальным количеством байтов, необходимых для хранения определенных вами данных).
Это зависит от того, что вы подразумеваете под 'performance gain'. Если вам нужно только 50 из них, и у вас не так мало памяти, то отдельные булы-это почти всегда лучший выбор, чем набор бит. Они заберут больше памяти, но булы будут гораздо быстрее. Битовый набор обычно реализуется в виде массива int (булы упаковываются в эти int). Таким образом, первые 32 була (бита) в вашем битовом наборе будут занимать только один 32-битный int, но для чтения каждого значения вам нужно сначала выполнить некоторые побитовые операции, чтобы замаскировать все значения, которые вы не хотите. E.g. чтобы прочитать 2-й бит битового набора, вам необходимо:
- Найти интервал, который содержит бит, который вы хотите (в данном случае, это первый инт)
- Побитовое и это int с '2' (т. е. значение & 0x02), чтобы узнать, установлен ли этот бит
Однако, если память является узким местом, и у вас есть много булов, использование битового набора может иметь смысл (например, если вы целевая платформа-мобильный телефон, или это какое-то состояние в очень загруженном веб-сервисе)
NOTE: a std::vector of bool обычно имеет специализацию на использовании эквивалента битового набора, что делает его намного меньше и также медленнее по тем же причинам. Поэтому, если скорость является проблемой, вам будет лучше использовать вектор char (или даже int), или даже просто использовать старый школьный массив bool.