WedX - журнал о программировании и компьютерных науках

В C ++ Какой смысл использовать bool вместо char?

sizeof (char) и sizeof (bool) равны 1 (в моем компиляторе / системе / где угодно, я слышал, что это не всегда одно и то же значение), bool может хранить только true или false, в то время как char может занимать больше значения и могут действовать как несколько переменных типа bool с использованием побитовых операторов (8 битов, каждый бит может использоваться как 1 bool, всего 8 bool)

Так есть ли преимущества в использовании bool вместо char?

Так что, кроме удобочитаемости, есть что-нибудь еще? Я где-то читал, что int обрабатывается быстрее, чем short или byte, даже если занимает больше памяти. Есть ли разница в скорости между char и bool?


  • Да: bool может хранить только true или false. 03.11.2013
  • Читаемость: использование bool сообщает, что вы собираетесь хранить только true или false. Кроме того, точность с вашими типами позволяет лучше выводить сообщения об ошибках и лучше разрешать перегрузки. 03.11.2013
  • sizeof(bool) не обязательно 1, реализация может выбрать больший размер. 03.11.2013
  • Если бы не было bool, вы бы спросили, почему нет bool, а есть только char. 03.11.2013
  • Что ж, теоретически вы можете хранить 8 булевых значений в одном символе, если ваша система позволяет это. Но главная причина - это намерение. 03.11.2013
  • Есть ли разница в скорости между char и bool? 03.11.2013
  • С bool вы можете сравнить значение с true; с char вы не можете, потому что каждое ненулевое значение истинно. 03.11.2013

Ответы:


1

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

03.11.2013

2

bool - это сокращение от "логического", поэтому каждый, кто знаком с логической алгеброй, может быть уверен, что переменная может хранить только одно из двух логических значений (true или false): если вам нужна переменная, которая может находиться только в одном из этих двух логических состояний, есть ли причина использовать что-то, что могло бы хранить что-нибудь еще?

Единственный размер, четко определенный стандартом, - sizeof(char), это 1 байт, но sizeof(bool) отличается. Что касается 1 бита на значение, это о шаблоне логического вектора.

[принимая во внимание правку]

Вы профилировали свое приложение и обнаружили, что это узкое место? Насколько я знаю, нет никаких преимуществ, кроме использования логических векторов, если вы нужно хранить и манипулировать парой логических переменных.

03.11.2013
  • одно преимущество, на которое мне указали, заключалось в том, что, поскольку char использует 8 бит памяти, он может действовать как восемь логических переменных с помощью побитовых операторов, в основном для экономии места в памяти 03.11.2013
  • @KyleRosales, определенно. Во многих библиотеках также есть определения для byte, word и dword. Я не являюсь носителем английского языка, но для меня довольно странно сдвигать, маскировать или побитовое сравнение символов и целых чисел: D 03.11.2013
  • @KyleRosales Ввод восьми логических значений в символ не экономит место в памяти. Машинные инструкции будут использовать больше памяти, которая потребуется для извлечения и тестирования каждого бита. 03.11.2013
  • @KyleRosales: Вы можете сэкономить место вручную, приложив много усилий. Если вы объявляете 8 bools, компилятор потенциально может автоматически выполнять такую ​​же оптимизацию, если захочет (вероятно, причина в том, что это не автоматическая оптимизация компилятора (т.е. не стоит экономить место (или это стоит с точки зрения скорости) ). Но компилятор будет делать это только в том случае, если он всегда безопасен. Что является потенциальной опасностью самооптимизации, которую часто упускают из виду. Есть некоторые типы, которые могут помочь std::bitset<8>. 03.11.2013
  • Нет, я никогда не создавал код, в котором использование bool становилось узким местом, я просто задавал теоретические вопросы 06.11.2013
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]