Функция sizeof в си

Функция sizeof в си

sizeof — это унарный оператор, возвращающий длину в байтах переменной или типа, помещенных в скобки. Например:

float f;
printf("%f ", sizeof f);
printf("%d", sizeof(int));

выдает 4 2. (Предполагается использование 16-битных целых.)

Помните, что для вычисления размера типа следует поместить имя типа в круглые скобки. В этом нет необходимости для имен переменных.

Использование sizeof помогает создавать переносимый код для тех случаев, когда код зависит от размера стандартных типов данных С. Например, представим, что программе, работающей с базой данных, необходимо сохранять 6 целочисленных значений в записи. Для того, чтобы сделать эту программу переносимой, не следует предполагать, что размер целочисленного типа — 2 или 4 байта, следует самостоятельно определить настоящую длину, используя sizeof. Следующая подпрограмма может быть использована для сохранения записи в файле:

/* Запись записи в файл */

void put_rec(FILE *fp, int rec[6])
<
int size, num;
size = sizeof(int) * 6;
num = fwrite(rec, size, 1, fp) ;
if(num!=1) printf("ошибка записи");
>

Самое главное в этом примере то, что put_rec() будет компилироваться и корректно запускаться на любом компьютере, включая компьютеры, использующие 2- и 4-байтные целые.

Обновл. 1 Дек 2019 |

Как мы уже знаем из урока №28, память на современных компьютерах, как правило, организована в блоки, которые состоят из байт, причём каждый блок имеет свой уникальный адрес. До этого момента, память можно было сравнивать с почтовыми ящиками (те, которые находятся в каждом подъезде), куда мы можем поместить информацию и откуда мы её можем извлечь, а переменные — это всего лишь номера этих почтовых ящиков.

Тем не менее, эта аналогия не совсем подходит к программированию, так как переменные могут занимать больше 1 байта памяти. Следовательно, одна переменная может использовать 2, 4 или даже 8 последовательных адресов. Объём памяти, который использует переменная, зависит от её типа данных. Так как мы, как правило, получаем доступ к памяти через имена переменных, а не через адреса памяти, то компилятор может скрывать от нас все детали работы с переменными разных размеров.

Есть несколько причин по которым полезно знать, сколько памяти занимает определённая переменная/тип данных.

Читайте также:  Система имеет проблемы с активацией windows 10

Во-первых, чем больше она занимает, тем больше информации сможет хранить. Так как каждый бит содержит либо 0 , либо 1 , то 1 бит может иметь 2 возможных значения.

2 бита могут иметь 4 возможных значения:

бит 0 бит 1
1
1
1 1

3 бита могут иметь 8 возможных значений:

бит 0 бит 1 бит 2
1
1
1 1
1
1 1
1 1
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() — это унарный оператор, который вычисляет и возвращает размер определённой переменной или определённого типа данных в байтах. Вы можете скомпилировать и запустить следующую программу, чтобы выяснить, сколько занимают разные типы данных на вашем компьютере:

Возвращает размер своего операнда относительно размера типа char. Yields the size of its operand with respect to the size of type char.

Сведения о sizeof . оператора, см. в разделе многоточия и шаблоны с переменным числом аргументов. For information about the sizeof . operator, see Ellipses and Variadic Templates.

Читайте также:  Форд мондео коробка робот отзывы

Синтаксис Syntax

Примечания Remarks

Результат sizeof оператор имеет тип size_t , целочисленный тип, определенный во включаемом файле . The result of the sizeof operator is of type size_t , an integral type defined in the include file . Этот оператор позволяет избежать задания зависимых от компьютера размера данных в программах. This operator allows you to avoid specifying machine-dependent data sizes in your programs.

Операнд sizeof может принимать одно из следующих: The operand to sizeof can be one of the following:

Имя типа. A type name. Чтобы использовать sizeof с именем типа, имя должно быть заключено в круглые скобки. To use sizeof with a type name, the name must be enclosed in parentheses.

Выражения. An expression. При использовании с помощью выражения, sizeof можно указать с или без скобок. When used with an expression, sizeof can be specified with or without the parentheses. Значение выражения не вычисляется. The expression is not evaluated.

Когда sizeof оператор применяется к объекту типа char, он дает результат 1. When the sizeof operator is applied to an object of type char, it yields 1. Когда sizeof оператор применяется к массиву, то результатом является общее число байтов в этом массиве, а не размер указателя, представленного идентификатором массива. When the sizeof operator is applied to an array, it yields the total number of bytes in that array, not the size of the pointer represented by the array identifier. Чтобы получить размер указателя, представленного идентификатором массива, передайте его в качестве параметра для функции, которая использует sizeof. To obtain the size of the pointer represented by the array identifier, pass it as a parameter to a function that uses sizeof. Пример: For example:

Пример Example

Пример результатов выполнения Sample Output

Когда sizeof оператор применяется к класс, структуры, или объединение тип, результат — число байтов в объект, тип, а также любое заполнение, которое добавляется выравнивания членов в границах слова. When the sizeof operator is applied to a class, struct, or union type, the result is the number of bytes in an object of that type, plus any padding added to align members on word boundaries. Результат не обязательно должен соответствовать размеру, вычисляемому путем добавления требований к хранению отдельных членов. The result does not necessarily correspond to the size calculated by adding the storage requirements of the individual members. /Zp параметр компилятора и пакет pragma влияют на границы выравнивания для членов. The /Zp compiler option and the pack pragma affect alignment boundaries for members.

Читайте также:  Укажите верный вариант переноса слова

Sizeof оператор никогда не возвращает 0, даже для пустого класса. The sizeof operator never yields 0, even for an empty class.

Sizeof оператор не может использоваться со следующими операндами: The sizeof operator cannot be used with the following operands:

Функции. Functions. (Однако sizeof можно применять к указателям на функции.) (However, sizeof can be applied to pointers to functions.)

Битовые поля. Bit fields.

Неопределенные классы. Undefined classes.

Тип void. The type void.

Динамически создаваемые массивы. Dynamically allocated arrays.

Внешние массивы. External arrays.

Неполные типы. Incomplete types.

Заключенные в скобки имена неполных типов. Parenthesized names of incomplete types.

Когда sizeof оператор применяется к ссылке, результат будет такой же так, как если sizeof применен к самому объекту. When the sizeof operator is applied to a reference, the result is the same as if sizeof had been applied to the object itself.

Если безразмерный массив является последним элементом структуры, sizeof оператор возвращает размер структуры без массива. If an unsized array is the last element of a structure, the sizeof operator returns the size of the structure without the array.

Sizeof оператор часто используется для вычисления числа элементов в массиве, с помощью выражения вида: The sizeof operator is often used to calculate the number of elements in an array using an expression of the form:

Ссылка на основную публикацию
Adblock detector