Что является преимуществом использования типа данных bool над целыми значениями как 0 и 1 для значений true и false, которые будут более эффективными в использовании? И как он будет отличаться на разных языках, таких как c и C++?Логический тип данных с целыми типами данных для представления значений истинности
ответ
int
был использован в C, когда не был никакого bool
, нет никаких преимуществ с использованием целочисленного типа для представления логического значения в C++ или в современном C:
bool
имеет смысл,int
является нет:
bool try_something();
int try_something(); // What does this return?
Обычно в C иметь возвращая int
, чтобы указать на успех или неудачу, но многие (большинство?) из них не возвращают 1
на успех и 0
при сбое, они следуют стандарту UNIX, который должен вернуть 0
в случае успеха и что-то еще в случае ошибки, так что вы получите код, как это:
int close(int fd);
if (close(fd)) { /* Something bad happened... */ }
См close инструкцию, которая возвращает 0
на успех и -1
на провал. Для нового пользователя этот код обескураживает, вы ожидаете, что close
вернет что-то истинное, если оно будет успешным, а не наоборот.
- Если вам нужно хранить большое количество логических значений, вы можете захотеть оптимизировать хранилище, используя только один бит для представления значения (против 32 бит, если вы сохраните его в
int
), и в C++,std::vector<bool>
уже специализированы, чтобы сделать это, так:
std::vector<bool> bvec(8000); // Size ~ 1000 bytes (optimization of std::vector<bool>)
std::vector<int> ivec(8000); // Size ~ 32000 bytes (32-bits int)
Там нет никаких преимуществ, если вы используете их в тот же вес ay (например, сделав bool b = f();
против int b = f();
или vector<bool>
выше (если вы можете заменить int
на bool
без проблем в своем коде, то сделайте это)), но если вы используете int
для хранения нескольких булевых значений с помощью побитовых операций, это еще один вопрос.
Обратите внимание, что это применимо только к std::vector<bool>
, другие контейнеры, такие как std::array<bool, N>
не оптимизированы, потому что они не могут использовать прокси-объект «представлять» значение бита.
. Bool менее эффективен в хранении, чем целое число того же размера, что и у него всегда есть как минимум 7 бит заполнения, в отличие от сопоставимых целых чисел. Аргумент массива не имеет значения, поскольку вектор
Я согласен с этой частью: * bool имеет смысл, int не: *. – 2501
@ 2501 * «bool менее эффективен в хранении, чем целое число того же размера, что и в нем, по сравнению с сопоставимыми целыми числами, как минимум 7 бит заполнения». * - Не могли бы вы уточнить? Если вы используете 'uint8_t' (предполагая' sizeof (bool) == sizeof (uint8_t) 'и сохраняя' 0' или '1' внутри, вы также получите 7 бит заполнения. Если вы говорите о хранении нескольких логических значений на один из 'uint8_t', тогда мои аргументы о' std :: vector
Для сохранения памяти настоятельно рекомендуется использовать BOOL, например, если мы просто проверяем условие (true или false) или что-то в этом роде.
Bool занимает всего 1 байт (как правило, наименьший адресуемый размер) памяти, тогда как целое число может принимать 2 или 4 байта или более, зависит от компилятора.
Поэтому очень полезно использовать bool вместо integer для хранения только 1 или 0. Зачем тратить память, если вы можете сделать это за меньшую память.
И bool может гарантировать наличие значений только 0 или 1. Таким образом, это будет уместно для условных операторов.
sizeof (bool) не требуется 1 – abhiarora
@abhiarora Я написал вообще человека. – Stubborn
Потребление памяти не является причиной того, почему вы должны использовать bool в C или на C++.Если это была причина, вы использовали бы бит-бит с одним битом, установленным в 0 или 1, вместо того, чтобы тратить 8 бит. Логические функции не могут быть реализованы как биты, поэтому аргумент потребления памяти вздор. – Lundin
bool - встроенный булевский тип. Bool может иметь значения true
и false
.
Так что, если у вас есть сценарий, в котором boolean
типа имеет смысл, например, значение flag
или return
для обозначения yes/no
или success/failure
, вы бы рассмотреть вопрос об использовании bool
.
Но тогда, если у вас есть несколько таких значений, использование int(s)
было бы более уместным. bool
было бы нецелесообразным, поскольку соответствующие значения должны быть ограничены до true/false
.
Это в основном проблема стиля, и поэтому трудно доказать, что один из способов правильный. C допускает синтаксис if(x)
, где выполняется условие, если x отличен от нуля. Так что «правда» может быть немного ловушкой, if(x == true)
не всегда означает, что вы думаете. С другой стороны, return true
намного яснее, чем return 1
в функции, подобной is_valid()
. bool
может быть более эффективным с точки зрения памяти, но это может быть иллюзией, часто по-разному дополняется четырьмя байтами по соображениям эффективности.
Основная проблема с bool
, хотя опять-таки стиль вопрос, является то, что
mywdgt = openwidget("canvaswidget", 256, 256, true);
, очевидно, означает открыть или создать виджет, который является холст, и составляет 256 х 256 пикселей. Но каков последний параметр?
mywdgt = openwidget("canvaswidget", 256, 256, ALLOW_ALPHA);
намного понятнее. Вы знаете, что такое параметр и что он делает, на взгляд . Поэтому в функциональных подписях следует избегать аргументов bool
, используйте вместо этого определение и скажите, что означает флаг.
У более старых версий C не было типа данных bool – bruceg
Возможный дубликат [Который быстрее: if (bool) или if (int)?] (Http://stackoverflow.com/questions/5764956/which-is -faster-if-bool-or-ifint) – PRP
Использование 'bool' передает намерение, значение' bool' однозначно означает 'true' или' false', в то время как целочисленное значение может принимать еще много состояний. Эта неоднозначность может способствовать ошибкам, например, при сохранении кода. Разница в производительности, вероятно, незначителен, и если вам нужно обрабатывать столько логических значений, которые рассматриваются в оптимизации, вы можете сохранить значения в битете, как отдельные биты в массиве целочисленных значений. –