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