2016-09-22 9 views
0

Что является преимуществом использования типа данных bool над целыми значениями как 0 и 1 для значений true и false, которые будут более эффективными в использовании? И как он будет отличаться на разных языках, таких как c и C++?Логический тип данных с целыми типами данных для представления значений истинности

+1

У более старых версий C не было типа данных bool – bruceg

+3

Возможный дубликат [Который быстрее: if (bool) или if (int)?] (Http://stackoverflow.com/questions/5764956/which-is -faster-if-bool-or-ifint) – PRP

+0

Использование 'bool' передает намерение, значение' bool' однозначно означает 'true' или' false', в то время как целочисленное значение может принимать еще много состояний. Эта неоднозначность может способствовать ошибкам, например, при сохранении кода. Разница в производительности, вероятно, незначителен, и если вам нужно обрабатывать столько логических значений, которые рассматриваются в оптимизации, вы можете сохранить значения в битете, как отдельные биты в массиве целочисленных значений. –

ответ

2

int был использован в C, когда не был никакого bool, нет никаких преимуществ с использованием целочисленного типа для представления логического значения в C++ или в современном C:

  1. 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 вернет что-то истинное, если оно будет успешным, а не наоборот.

  1. Если вам нужно хранить большое количество логических значений, вы можете захотеть оптимизировать хранилище, используя только один бит для представления значения (против 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> не оптимизированы, потому что они не могут использовать прокси-объект «представлять» значение бита.

+0

. Bool менее эффективен в хранении, чем целое число того же размера, что и у него всегда есть как минимум 7 бит заполнения, в отличие от сопоставимых целых чисел. Аргумент массива не имеет значения, поскольку вектор не использует тип bool для его реализации, он использует целое число. Зачем? Поскольку целые числа более эффективны с точки зрения хранения. – 2501

+0

Я согласен с этой частью: * bool имеет смысл, int не: *. – 2501

+0

@ 2501 * «bool менее эффективен в хранении, чем целое число того же размера, что и в нем, по сравнению с сопоставимыми целыми числами, как минимум 7 бит заполнения». * - Не могли бы вы уточнить? Если вы используете 'uint8_t' (предполагая' sizeof (bool) == sizeof (uint8_t) 'и сохраняя' 0' или '1' внутри, вы также получите 7 бит заполнения. Если вы говорите о хранении нескольких логических значений на один из 'uint8_t', тогда мои аргументы о' std :: vector 'имеют значение, так как это именно то, что происходит. – Holt

0

Для сохранения памяти настоятельно рекомендуется использовать BOOL, например, если мы просто проверяем условие (true или false) или что-то в этом роде.

Bool занимает всего 1 байт (как правило, наименьший адресуемый размер) памяти, тогда как целое число может принимать 2 или 4 байта или более, зависит от компилятора.

Поэтому очень полезно использовать bool вместо integer для хранения только 1 или 0. Зачем тратить память, если вы можете сделать это за меньшую память.

И bool может гарантировать наличие значений только 0 или 1. Таким образом, это будет уместно для условных операторов.

+1

sizeof (bool) не требуется 1 – abhiarora

+1

@abhiarora Я написал вообще человека. – Stubborn

+2

Потребление памяти не является причиной того, почему вы должны использовать bool в C или на C++.Если это была причина, вы использовали бы бит-бит с одним битом, установленным в 0 или 1, вместо того, чтобы тратить 8 бит. Логические функции не могут быть реализованы как биты, поэтому аргумент потребления памяти вздор. – Lundin

0

bool - встроенный булевский тип. Bool может иметь значения true и false.

Так что, если у вас есть сценарий, в котором boolean типа имеет смысл, например, значение flag или return для обозначения yes/no или success/failure, вы бы рассмотреть вопрос об использовании bool.

Но тогда, если у вас есть несколько таких значений, использование int(s) было бы более уместным. bool было бы нецелесообразным, поскольку соответствующие значения должны быть ограничены до true/false.

1

Это в основном проблема стиля, и поэтому трудно доказать, что один из способов правильный. 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, используйте вместо этого определение и скажите, что означает флаг.