Как bool представлен в памяти?

как уже обсуждалось в документах, a bool тип данных занимает не менее байта памяти. Аналогичный вопрос был задан на SO раньше (как переменная типа bool хранится в памяти? (C++)), но это Обсуждение и документация, похоже, обсуждают только объем пространства, занимаемого булевым типом данных, а не то, что на самом деле происходит в когда я делаю это:

bool b = true;

Так что же на самом деле происходит в память? Что происходит с 7 битами, которые не используются для хранения этой информации? Предписывает ли стандарт такое поведение?

они не определены? Или кто-то в штаб-квартире C++ просто сделал это:

enum bool : char 
{
  false = 0,
  true = 1
};

4 ответов


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

"значения типа bool либо true или false. Как описано ниже, bool значения ведут себя как целочисленные типы. Значения типа bool участвовать в единой акции" ~ C++03 3.9.1 §6

"синоним целочисленный тип целочисленный тип. Представления интеграла типы должны определять значения с помощью чистой двоичной системы счисления" ~ C++03 3.9.1 §7

тем не менее он определяет интегральное продвижение от bool до int:

"значение rvalue типа bool можно преобразовать в rvalue типа int С false становится ноль и true стать одним из них. Эти преобразования называются интегральными акциями." ~ C++03 4.5 §4-5

а также преобразование из других типов в bool:

" нулевое значение, значение нулевого указателя или значение указателя нулевого члена преобразуется в false; любое другое значение преобразуется в true." ~ C++03 4.12 §1


стандарт ничего не предписывает для двоичного представления булов; он просто говорит, что при преобразовании в другие интегральные типы A true bool станет 1 и A false bool станет 0.

Это, конечно, предполагает реализацию, аналогичную по духу той, которую вы сказали, где такие преобразования станут по существу no-ops или простым целочисленным расширением (но помните, что bool должен быть примитивным типом, а не типом перечисления).


вы можете проверить такие вещи, скопировав память, игнорируя ее тип. Эта программа считывает значение raw памяти test_bool и помещает его в test_int, Так что вы можете распечатать его.

int test_int = 0;
bool test_bool;

test_bool = true;
memcpy (&test_int, &test_bool, sizeof(bool));
printf ("True value is: %d\n", test_int);

test_bool = false;
memcpy (&test_int, &test_bool, sizeof(bool));
printf ("False value is: %d\n", test_int);

для меня, эта программа дает:

True value is: 1
False value is: 0

Я не программировал на C++ с нескольких месяцев, но AFAIR правило следующее: 0-false; любое значение, отличное от 0-true; (по умолчанию это 1, но AFAIR, если вы конвертируете его из другого целого значения, ex. 2 также будет рассматриваться как true).

таким образом, Вы можете сказать, что C++ каким-то образом тратит память (другие тоже), поскольку он может использовать только один бит, но проще сделать компилятор.

В C++ вы также можете определить битовые поля (битовые поля в Википедия) но он не часто используется.