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

Чтобы увидеть, что /usr/bin/python указывает на

, если он указывает на python3 or higher, изменится на python2.7

Это должно решить проблему.

Я получал ошибку установки для всех пакетов python. Решение Abe Karplus & amp; обсуждение дало мне подсказку о том, что может быть проблемой. Затем я вспомнил, что я вручную изменил /usr/bin/python с python2.7 на /usr/bin/python3.5, что фактически вызвало проблему. Как только я reverted тот же. Это было решено.

13
задан Peter Mortensen 10 December 2009 в 19:59
поделиться

4 ответа

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

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

10
ответ дан 1 December 2019 в 21:39
поделиться

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

Bitset

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

Отдельный bools

  • Очень быстро
  • Bools не упаковываются вместе. Они будут участниками где-нибудь.

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

9
ответ дан 1 December 2019 в 21:39
поделиться

Это зависит, что Вы подразумеваете под 'увеличением производительности'. Если Вам только нужны 50 из них, и Вы не являетесь низкими на памяти, тогда отделяются, bools является в значительной степени всегда лучшим выбором, чем bitset. Они возьмут больше памяти, но bools будет намного быстрее. bitset обычно реализуется как массив ints (bools упаковываются в те ints). Таким образом, первые 32 bools (биты) в Вашем bitset только поднимут единственный интервал на 32 бита, но считать каждое значение необходимо сделать некоторые битовые операции сначала для каширования всех значений, которые Вы не хотите. Например, считать 2-й бит bitset, Вы должны:

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

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

ПРИМЕЧАНИЕ: станд.:: вектор bool обычно имеет специализацию для использования эквивалентный из bitset, таким образом делая это намного меньшим и также медленнее по тем же причинам. Таким образом, если скорость будет проблемой, то Вы будете более обеспеченным использованием вектора символа (или даже интервал) или даже просто использовать старую школу bool массив.

3
ответ дан 1 December 2019 в 21:39
поделиться

РЕ @Wilka:

На самом деле, bitsets поддерживаются 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 битов больше, чем данные, которые Вы определяете (его размер всегда является минимальным числом байтов, должен был хранить данные, которые Вы определили).

3
ответ дан 1 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: