Как 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++ вы также можете определить битовые поля (битовые поля в Википедия) но он не часто используется.