sizeof int чему равен
Оператор sizeof (C)
Оператор sizeof предоставляет объем хранения (в байтах), необходимого для хранения объекта типа «операнд». Этот оператор позволяет избежать задания зависимых от компьютера размера данных в программах.
Синтаксис
Примечания
Операнд является либо любым идентификатором unary-expression, либо выражением type-cas (то есть описателем типа, заключенным в скобки). unary-expression не может представлять объект битового поля, неполный тип или указатель функции. Результатом является целочисленная константа без знака. Стандартный заголовок STDDEF.H определяет этот тип как size_t.
При применении оператора sizeof к идентификатору массива результатом является размер целого массива, а не размер указателя, представленного идентификатором массива.
При применении оператора sizeof к имени структуры или типа объединения, идентификатору структуры или типа объединения, результатом является число байтов в структуре или объединении, включая внутреннее и конечное заполнение. Этот размер может включать внутреннее и конечное заполнение, используемое для выравнивания элементов структуры или объединения относительно границ памяти. Таким образом, результат может не соответствовать размеру, вычисленному путем добавления требований к хранению отдельных элементов.
Если безразмерный массив является последним элементом структуры, оператор sizeof возвращает размер структуры без массива.
Вопрос на собеседовании: sizeof(int)
Интересно мнение С++ разработчиков на ЛОР на следующий вопрос (я ответил верно): Ответьте подробно чему может быть равен sizeof(int)?
P.S. Пожалуйста, ответьте сразу и подробно без помощи гугла или чего-то ещё.
// C и С++ знаю на уровне хеловорлда
sizeof(short) ★★★★★ ( 28.12.16 16:14:14 )
Чему равен где? Модель памяти разная может быть. От 16 до 64 бит.
Всё верно, но поподробнее. Мы же в риал ворлд живём, где int используют так, что мама дорогая. Варианты в байтах, битах и почему.
последний раз видел 2 лет 12 назад.
То есть вы только что одобрили то, что прописано в стандарте языка? Вот спасибо.
Мы же в риал ворлд живём, где int используют так, что мама дорогая. Варианты в байтах, битах и почему.
В реальном мире оговаривают целевую платформу, компилятор и его версию.
sizeof(int) не меньше 1, при этом в int всегда не менее 16 бит
а 40 бит может быть?
тебе бы матчасть подучить. sizeof(int) может быть равен 1, при этом быть 32битным
мнения начинают разделяться =)
Теоретически конечно. sizeof(short) ★★★★★ ( 28.12.16 16:26:50 )
Не юродничай, вопрос был про результат sizeof(), он возвращает размер в байтах/октетах.
Блин, для того и придумали sizeof чтобы писать sizeof(int), а не парить мозг чему он равен. Выясняется за две секунды, если уж приспичило. лавров.jpg
ну и уровень на лоре.
sizeof не в байтах, sizeof в char’ах, в котором не обязательно 8 бит
он возвращает размер в байтах/октетах
еще один неуч с октетами, идите на расте писать, неосиляторы
Ответьте подробно чему может быть равен sizeof(int)?
The signed and unsigned integer types shall satisfy the constraints given in the C standard, section 5.2.4.2.1.
собеседование-то прошел? оффер сделали?
вопрос то был о размере int, а не о его лимитах
Ответьте подробно чему может быть равен sizeof(int)?
А что, зимние каникулы уже начались?
Вопрос-то был о размере int, а не short и long.
Стандарт гарантирует, что размер будет достаточным для этих лимитов, так что определять нижнюю границу в 2 байта вполне корректно. Стандарт не определяет верхнюю границу для лимитов, так что определять верхнюю границу в бесконечность тоже корректно. Требование size_of(short) ★ ( 28.12.16 16:50:36 )
определять нижнюю границу в 2 байта вполне корректно
иди дальше на php пиши, раз даже оператор sizeof осилить не можешь
Ответьте подробно чему может быть равен sizeof(int)?
Нулю 🙂 Лол 🙂 Отвечаю подробно:
по такой логике, вариант, когда в моем компиляторе CHAR_BIT равен 32, а sizeof(char) == sizeof(short) == sizeof(int) == 1 не имеет права на жизнь? хотя стандарт такого не запрещает.
sizeof не в байтах, sizeof в char’ах, в котором не обязательно 8 бит
Всё верно, но поподробнее. Мы же в риал ворлд живём, где int используют так, что мама дорогая. Варианты в байтах, битах и почему.
«Варианты в битах» к обозначенному в теме вопросу отношения не имеют, поскольку sizeof по определению возвращает размер в байтах и
«Варианты в битах» к обозначенному в теме вопросу отношения не имеют
он возвращает размер в байтах/октетах.
Анонимус, ты читать умеешь?
В байтах, но при этом байт может иметь ширину больше 8 бит.
Внезапно, похоже ты прав. С99, 6.5.3.4.2:
The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type.
When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.
Т.е. C99 (а за ним и С++14) не определяет byte как 8 бит, а значит при CHAR_BIT>8 INT_MAX=32767 может влезть в один byte, а значит sizeof(int) вполне может быть 1.
Больше или равно единице. Хоть у тебя там троичная система с трайтами из шести трит.
4.3 – Размеры объектов и оператор sizeof
Размеры объектов
Как вы узнали из урока «4.1 – Введение в основные типы данных», память на современных машинах обычно организована в блоки размером с байты, причем каждый байт памяти имеет уникальный адрес. До этого момента было полезно думать о памяти как о связке почтовых ящиков, куда мы можем помещать и извлекать информацию, а переменные в этой аналогии – имена для доступа к этим почтовым ящикам.
Однако эта аналогия не совсем верна в одном отношении – большинство объектов на самом деле занимают более 1 байта памяти. Один объект может использовать 2, 4, 8 или более последовательных адресов памяти. Объем памяти, который использует объект, зависит от его типа данных.
Тем не менее, есть несколько причин, по которым полезно знать, сколько памяти использует какой-либо объект.
Во-первых, чем больше памяти использует объект, тем больше информации он может вместить.
Один бит может содержать 2 возможных значения, 0 или 1:
2 бита могут содержать 4 возможных значения:
бит 0 | бит 1 |
---|---|
0 | 0 |
0 | 1 |
1 | 0 |
1 | 1 |
3 бита могут содержать 8 возможных значений:
бит 0 | бит 1 | бит 2 |
---|---|---|
0 | 0 | 0 |
0 | 0 | 1 |
0 | 1 | 0 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 0 | 1 |
1 | 1 | 0 |
1 | 1 | 1 |
В общем, объект из n битов (где n – целое число) может содержать 2 n (2 в степени n, также иногда записывается 2^n) уникальных значений. Следовательно, при байте из 8 битов, объект размером 1 байт может принимать 2 8 (256) различных значений. Объект, который использует 2 байта, может принимать 2^16 (65536) разных значений!
Таким образом, размер объекта ограничивает количество уникальных значений, которые он может принимать – объекты, которые используют больше байтов, могут принимать большее количество уникальных значений. Мы рассмотрим это дальше, когда поговорим подробнее о целых числах.
Во-вторых, у компьютеров объем свободной памяти ограничен. Каждый раз, когда мы определяем объект, небольшая часть этой свободной памяти используется, пока существует объект. Поскольку у современных компьютеров много памяти, это влияние обычно незначительно. Однако для программ, которым требуется большое количество объектов или данных (например, игра, которая отображает миллионы полигонов), разница между использованием 1- и 8-байтовых объектов может быть значительной.
Ключевой момент
Начинающие программисты часто слишком много внимания уделяют оптимизации своего кода, чтобы использовать как можно меньше памяти. В большинстве случаев достигаемая разница незначительна. Сосредоточьтесь на написании поддерживаемого кода и оптимизируйте его только тогда и там, где выгода будет существенной.
Размеры основных типов данных
Следующий очевидный вопрос – «сколько памяти занимают переменные разных типов данных?». Вы можете быть удивлены, обнаружив, что размер конкретного типа данных зависит от компилятора и/или архитектуры компьютера!
C++ гарантирует только минимальный размер каждого базового типа данных:
Категория | Тип | Минимальный размер | Примечание |
---|---|---|---|
логический | bool | 1 байт | |
символ | char | 1 байт | всегда точно 1 байт |
wchar_t | 1 байт | ||
char16_t | 2 байта | тип C++11 | |
char32_t | 4 байта | тип C++11 | |
целочисленное значение | short | 2 байта | |
int | 2 байта | ||
long | 4 байта | ||
long long | 8 байт | тип C99/C++11 | |
с плавающей запятой | float | 4 байта | |
double | 8 байт | ||
long double | 8 байт |
Лучшая практика
Для максимальной совместимости не следует предполагать, что переменные могут быть больше указанного минимального размера.
Объекты базовых типов данных обычно работают очень быстро.
Оператор sizeof
Вот результат работы этой программы, полученный автором, на машине x64 при использовании Visual Studio:
Для продвинутых читателей
Если вам интересно, что такое » \t » в приведенной выше программе, это специальный символ, который вставляет табуляцию (в этом примере мы используем ее для выравнивания выходных столбцов). Мы рассмотрим » \t » и другие специальные символы в уроке «4.11 – Символы».
Вы также можете использовать оператор sizeof для имени переменной:
Производительность при использовании базовых типов данных
На современных машинах объекты базовых типов данных работают быстро, поэтому производительность при использовании этих типов обычно не должна быть проблемой.
В качестве отступления.
Урок №30. Размер типов данных
Обновл. 11 Сен 2021 |
Как мы уже знаем из урока №28, память на современных компьютерах, как правило, организована в блоки, которые состоят из байтов, причем каждый блок имеет свой уникальный адрес. До этого момента, память можно было сравнивать с почтовыми ящиками (с теми, которые находятся в каждом подъезде), куда мы можем поместить информацию и откуда мы её можем извлечь, а имена переменных — это всего лишь номера этих почтовых ящиков.
Тем не менее, эта аналогия не совсем подходит к программированию, так как переменные могут занимать больше 1 байта памяти. Следовательно, одна переменная может использовать 2, 4 или даже 8 последовательных адресов. Объем памяти, который использует переменная, зависит от типа данных этой переменной. Так как мы, как правило, получаем доступ к памяти через имена переменных, а не через адреса памяти, то компилятор может скрывать от нас все детали работы с переменными разных размеров.
Есть несколько причин по которым полезно знать, сколько памяти занимает определенная переменная/тип данных.
2 бита могут иметь 4 возможных значения:
3 бита могут иметь 8 возможных значений:
бит 0 | бит 1 | бит 2 |
0 | 0 | 0 |
0 | 0 | 1 |
0 | 1 | 0 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 0 | 1 |
1 | 1 | 0 |
1 | 1 | 1 |
По сути, переменная с n-ным количеством бит может иметь 2 n возможных значений. Поскольку байт состоит из 8 бит, то он может иметь 2 8 (256) возможных значений.
Размер переменной накладывает ограничения на количество информации, которую она может хранить. Следовательно, переменные, которые используют больше байт, могут хранить более широкий диапазон значений.
Во-вторых, компьютеры имеют ограниченное количество свободной памяти. Каждый раз, когда мы объявляем переменную, небольшая часть этой свободной памяти выделяется до тех пор, пока переменная существует. Поскольку современные компьютеры имеют много памяти, то в большинстве случаев это не является проблемой, особенно когда в программе всего лишь несколько переменных. Тем не менее, для программ с большим количеством переменных (например, 100 000), разница между использованием 1-байтовых или 8-байтовых переменных может быть значительной.
Размер основных типов данных в C++
Возникает вопрос: «Сколько памяти занимают переменные разных типов данных?». Вы можете удивиться, но размер переменной с любым типом данных зависит от компилятора и/или архитектуры компьютера!
Язык C++ гарантирует только их минимальный размер:
Тип | Минимальный размер | |
Логический тип данных | bool | 1 байт |
Символьный тип данных | char | 1 байт |
wchar_t | 1 байт | |
char16_t | 2 байта | |
char32_t | 4 байта | |
Целочисленный тип данных | short | 2 байта |
int | 2 байта | |
long | 4 байта | |
long long | 8 байт | |
Тип данных с плавающей запятой | float | 4 байта |
double | 8 байт | |
long double | 8 байт |
Фактический размер переменных может отличаться на разных компьютерах, поэтому для его определения используют оператор sizeof.
Оператор sizeof — это унарный оператор, который вычисляет и возвращает размер определенной переменной или определенного типа данных в байтах. Вы можете скомпилировать и запустить следующую программу, чтобы выяснить, сколько занимают разные типы данных на вашем компьютере:
BestProg
Содержание
Поиск на других ресурсах:
1. Какое назначение операции sizeof в программах на C++?
Операция sizeof предназначена для определения размера типа данных, переменной базового типа, переменной структурного типа, числового значения, строчного значения и т.п.
Операция sizeof есть полезной в случаях, когда необходимо динамически выделять память для переменных. В этом случае нужно знать объем памяти, которую занимает объект того или другого типа.
Общий вид операции sizeof :
2. Примеры использования операции sizeof для базовых типов и числовых значений
В приведенном ниже фрагменте кода приведен пример определения размера переменной базового типа, числового значения, строчного значения или результата выражения.
3. Как определить размер структурной переменной? Пример
Пусть задана структурная переменная, описывающая данные о студенте. Шаблон структуры описывается в отдельном файле «MyStruct_Student.h» :
4. Как определить размер массива чисел? Пример
5. Как определить размер массива структур? Пример
Пусть задана структурная переменная, описывающая данные о студенте. Шаблон структуры описывается в отдельном файле «MyStruct_Student.h» :
6. Как определить размер объекта (экземпляра) класса? Пример
Пусть в модуле «MyClass.h» описывается класс с именем MyPoint :
Чтобы определить размер памяти, которая выделяется для объекта этого класса, нужно написать такой программный код:
Как видно из результата, операция sizeof() определяет объем памяти, который выделяется под переменные (поля) класса.
7. Как определить размер массива объектов класса? Пример
Пусть в модуле «MyClass.h» описывается класс с именем MyPoint :
В нижеследующем фрагменте кода вычисляется минимальное значение между двумя переменными a и b :