Для чего нужен sizeof
4.8. Оператор sizeof
4.8. Оператор sizeof
Оператор sizeof возвращает размер в байтах объекта или типа данных. Синтаксис его таков:
Результат имеет специальный тип size_t, который определен как typedef в заголовочном файле cstddef. Вот пример использования обеих форм оператора sizeof:
// sizeof возвращает размер всего массива
size_t array_size = sizeof ia;
// sizeof возвращает размер типа int
size_t element_size = array_size / sizeof( int );
Применение sizeof к массиву дает количество байтов, занимаемых массивом, а не количество его элементов и не размер в байтах каждого из них. Так, например, в системах, где int хранится в 4 байтах, значением array_size будет 12. Применение sizeof к указателю дает размер самого указателя, а не объекта, на который он указывает:
size_t pointer_size = sizeof ( pi );
Здесь значением pointer_size будет память под указатель в байтах (4 в 32-битных системах), а не массива ia.
Вот пример программы, использующей оператор sizeof:
ia = sizeof( ia ); // правильно
ia = sizeof ia; // правильно
// ia = sizeof int; // ошибка
ia = sizeof( int ); // правильно
int *pi = new int[ 12 ];
cout «pi: » sizeof( pi )
// sizeof строки не зависит от
string st2( «a mighty oak» );
cout » st1: » sizeof( st1 )
cout «short : » sizeof(short) endl;
cout «shorf» : » sizeof(short*) endl;
cout «short : » sizeof(short) endl;
cout «short[3] : » sizeof(short[3]) endl;
Результатом работы программы будет:
st1: 12 st2: 12 ps: 4 *ps:12
Из данного примера видно, что применение sizeof к указателю позволяет узнать размер памяти, необходимой для хранения адреса. Если же аргументом sizeof является ссылка, мы получим размер связанного с ней объекта.
Гарантируется, что в любой реализации С++ размер типа char равен 1.
size_t char_size = sizeof( char );
Значение оператора sizeof вычисляется во время компиляции и считается константой. Оно может быть использовано везде, где требуется константное значение, в том числе в качестве размера встроенного массива. Например:
// правильно: константное выражение
int array[ sizeof( some_type_T )];
Читайте также
R.5.3.2 Операция sizeof
R.5.3.2 Операция sizeof Операция sizeof вычисляет размер своего операнда в байтах. Операнд должен быть или выражением, которое не вычисляется, или именем типа в скобках. Операцию sizeof нельзя применять к функции, битовому полю, неопределенному классу, типу void или к массиву с
R.6.5.1 Оператор while
R.6.5.1 Оператор while В операторе while вложенный оператор выполняется до тех пор, пока значение выражения не станет равным нулю. Проверка происходит перед каждым выполнением оператора.Выражение должно быть арифметического типа, или типа указателя, или типа класс, для которого
R.6.5.2 Оператор do
R.6.5.2 Оператор do В операторе do вложенный оператор выполняется до тех пор, пока значение выражения не станет равным нулю. Проверка происходит после каждого выполнения оператора.Выражение должно быть арифметического типа, или типа указателя, или типа класс, для которого
R.6.5.3 Оператор for
R.6.5.3 Оператор for Оператор for for ( оператор-иниц выражение-1 opt ; выражение-2 opt ) операторэквивалентен конструкцииоператор-иницwhile ( выражение-1 ) < оператор выражение-2 ;>за исключением того факта, что оператор continue в операторе for вызовет выполнение выражение-2 перед тем, как
Правило 52: Если вы написали оператор new с размещением, напишите и соответствующий оператор delete
Правило 52: Если вы написали оператор new с размещением, напишите и соответствующий оператор delete Операторы new и delete с размещением встречаются в C++ не слишком часто, поэтому в том, что вы с ними не знакомы, нет ничего страшного. Вспомните (правила 16 и 17), что когда вы пишете такое
Ключевое слово sizeof
Ключевое слово sizeof В заключение обсуждения вопросов, связанных с небезопасным контекстом в C#, рассмотрим ключевое слово sizeof. Как и в C(++), ключевое слово C# sizeof используется для того, чтобы выяснить размер в байтах типа, характеризуемого значениями (но не ссылочного типа), и
1. Оператор Select – базовый оператор языка структурированных запросов
1. Оператор Select – базовый оператор языка структурированных запросов Центральное место в языке структурированных запросов SQL занимает оператор Select, с помощью которого реализуется самая востребованная операция при работе с базами данных – запросы.Оператор Select
15.8.2. Оператор размещения new() и оператор delete()
7.2.2 Sizeof
7.2.2 Sizeof Операция sizeof дает размер операнда в байтах. (Байт не определяется языком иначе, чем через значение sizeof. Однако, во всех существующих реализациях байт есть пространтсво, нобходимое для хранения char.) При применении к массиву рзультатом является полное количество
6.1. Оператор &&
6.1. Оператор && Общий формат оператора && таков:команда1 && команда2Эта инструкция обрабатывается следующим образом: правый операнд интерпретируется только тогда, когда левый операнд равен TRUE. Иными словами, вторая команда выполняется в том случае, если первая
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 для имени переменной:
Производительность при использовании базовых типов данных
На современных машинах объекты базовых типов данных работают быстро, поэтому производительность при использовании этих типов обычно не должна быть проблемой.
В качестве отступления.
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 :
Оператор sizeof (C)
Оператор sizeof предоставляет объем хранения (в байтах), необходимого для хранения объекта типа «операнд». Этот оператор позволяет избежать задания зависимых от компьютера размера данных в программах.
Синтаксис
Примечания
Операнд является либо любым идентификатором unary-expression, либо выражением type-cas (то есть описателем типа, заключенным в скобки). unary-expression не может представлять объект битового поля, неполный тип или указатель функции. Результатом является целочисленная константа без знака. Стандартный заголовок STDDEF.H определяет этот тип как size_t.
При применении оператора sizeof к идентификатору массива результатом является размер целого массива, а не размер указателя, представленного идентификатором массива.
При применении оператора sizeof к имени структуры или типа объединения, идентификатору структуры или типа объединения, результатом является число байтов в структуре или объединении, включая внутреннее и конечное заполнение. Этот размер может включать внутреннее и конечное заполнение, используемое для выравнивания элементов структуры или объединения относительно границ памяти. Таким образом, результат может не соответствовать размеру, вычисленному путем добавления требований к хранению отдельных элементов.
Если безразмерный массив является последним элементом структуры, оператор 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 — это унарный оператор, который вычисляет и возвращает размер определенной переменной или определенного типа данных в байтах. Вы можете скомпилировать и запустить следующую программу, чтобы выяснить, сколько занимают разные типы данных на вашем компьютере: