Существует более одного вида эффективности. Эффективность памяти одна. Еще одним фактором является эффективность скорости.
Исходный язык C вообще не имел типа boolean
- обычно программист использовал бы int
для логических флагов, 0
для ложных и 1
за правду. Если они действительно заботились об эффективности памяти, они могли бы использовать растровое изображение для хранения восьми логических значений в байте, но это обычно было необходимо только в ситуациях, когда памяти действительно было мало. Но доступ к int
на быстрее , чем к int
и распаковке составляющих его бит.
_Bool
/ bool
был представлен в C99. Он отражает обычную практику хранения логических значений в int.
Тем не менее, он имеет преимущество в том, что компилятор знает, что это логическое значение, поэтому сложнее случайно присвоить ему значение 3
, добавить его к целое число и т. д. c.
Большинство языков программирования сегодня хранят логическое значение в байте. Да, он использует в восемь раз больше памяти, чем необходимо - но это быстро, и редко бывает так много логических значений на go сразу, что потери становятся значительными.
Во многих языках программирования реализация Отдельно от языка spe c - Javascript spe c не говорит, как среда выполнения Javascript должна хранить true
или false
. Однако в C99 вы можете положиться на true
, эквивалентное целому числу 1
.
Если логические значения действительно используют слишком много памяти вашей системы, вы можете работать с побитовыми операциями для хранения 8 логических значений в unsigned char
или больше для более крупных типов.
Вы можете сделать это для операций во время выполнения, если это необходимо, или просто для записи в выходной формат (если проблема заключается в размере записей в файловых системах или сетевых пакетах).
Стоит отметить, что во многих современных приложениях люди с радостью представляют false
на проводе или в файловой системе как 7 байтов [ '"', 'f', 'a', 'l', 's', 'e', '"' ]