Из int, char, float и bool, что является наименьшим?
Ниже приведен тест программирования "заполнение дома", который является частью прикладного процесса для MSc в разработке игр в британском университете:
Основы С++
Если программа объявила четыре переменные, один из типов int
, один из типов float
, один из типов char
и один из типов bool
, какая переменная будет занимать наименьшее пространство в памяти?
В соответствии с инструкциями есть только одно истинное утверждение. Однако моя книга на С++ (С++ Pocket Reference, O'Reilly) гласит: "Типичный размер bool - один байт" и "Размер char - один байт. Технически размер байта определяется реализацией, но редко бывает ничего, кроме восьми бит."
Я что-то не понимаю? Какой ответ вы бы поставили и почему?
Ответы
Ответ 1
Нет типа принимает меньше, чем char
, потому что по определению sizeof(char) == 1
. Однако вполне возможно, что все типы занимают одинаковое пространство.
(Представление каждого типа с 16 битами (с подходящим необычным форматом с плавающей запятой) было бы достаточным для удовлетворения стандартных требований диапазона значений: реальное оборудование, в котором каждый тип имеет 32 бита.)
Ответ 2
Если программа объявила четыре переменные, один из типов int, один из типов float, один из типов char и один из типа bool, какая переменная заняла бы наименьшее пространство в памяти?
Реальная проблема с вопросом, который вы опубликовали, лежит в этих словах:
occupy ... space in memory
Если предполагается интерпретация, то в большинстве случаев вы принимаете один из популярных популярных компиляторов, и в этом случае ответ 2
и 4
будут занимать наименьшее пространство в памяти. Просто потому, что текущие популярные компиляторы делают char
и bool
занимают один байт в памяти...
Как указано в комментариях, sizeof() is of type size_t
, который является целым.
Как sizeof(char) == 1
всегда истинно в соответствии со стандартом, а значение является интегральным; никакая другая sizeof(T)
не может быть меньше 1
. Но любой другой T
, чем char
может быть больше, чем 1
, зависящий от реализации. Поскольку вы не можете предположить, что sizeof(char) == sizeof(bool)
всегда выполняется, вы можете хотя бы предположить, что sizeof(char) <= sizeof(bool)
имеет значение.
Что делает sizeof(char)
наименее правильным ответом...
Ответ 3
Ответ char
. Нет другого ответа.
(Хотя я согласен, вопрос должен был быть сформулирован лучше).
Стандарт С++ 03 $5.3.3/1 гласит:
sizeof (char), sizeof (подпись char) и sizeof (без знака char) равны 1; результат sizeof, примененный к любому другому фундаментальному типу (3.9.1), является реализации. [Примечание: в частности, sizeof (bool) и sizeof (wchar_t) определены реализацией .69)
(Нашел эту информацию с другого вопроса: Почему sizeof (bool) не определен как один, самим стандартом?).
Учитывая, что минимальный размер равен 1 (sizeof должен возвращать интегральные значения), это означает, что в любой реализации, следующей за стандартами, будет следовать следующее:
sizeof(char) == 1
sizeof(bool) >= 1
sizeof(int) >= 1
sizeof(float) >= 1
Вопрос был плохо сформулирован и, вероятно, следовало спросить более четко: "... какая переменная обязательно занимает больше места в памяти, чем любая другая (в любой корректной реализации С++)?
Ответ 4
Язык не задает никаких отношений между этими размерами типа, которые гарантируют правильный ответ на этот вопрос как поставленный. Например, они могут быть 32-битными типами.
Ответ 5
Я думаю, правильный ответ должен быть 2. По определению char является наименьшей адресуемой единицей.
Также см.: Почему char и bool одинакового размера в С++?
Ответ 6
Стандарт С++ дает следующие отношения:
sizeof(char) == 1
sizeof(char) <= sizeof(int) <= sizeof(long)
sizeof(float) <= sizeof(double)
...
Ответ 7
Нет гарантии точного размера этих типов, но есть гарантия, что char не больше короткого, а короткий - не длиннее.
Итак, char всегда будет занимать наименьший объем памяти, но, возможно, это не единственный. Он по-прежнему гарантирует, что ничего больше не будет иметь меньшего размера.
Однако может быть исключение с bool на некоторых специальных встроенных микроконтроллерах. Они могут иметь переменную bit
, которая занимает ровно один бит, однако они не находятся в ОЗУ, а в специальных регистрах.
Однако, если ваша архитектура и компилятор особенно странны или необычны, вы можете разумно ожидать, что char
равно 1, short
равно 2, long
равно 4, long long
равно 8, а int
- либо 2 или 4, но обычно 4 байта.
Ответ 8
sizeof (bool) определяется реализацией.
Определен ли sizeof (bool)?
А именно, не требуется только один байт.
Ответ 9
Правильный ответ логичен в теории, так как char требует знания не менее 8 бит, тогда как bool технически требует только один бит. вы могли бы разбить 8 bools внутри одного char, если хотите теоретически.
Ответ 10
типичный размер bool
- один байт. не означает, что всегда - один байт. Вопрос либо относится к реализации, которая не имеет размер в один байт bool
, либо подразумевает, что только одна переменная имеет наименьший размер.