Что определяет операция sizeof str
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 :
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 для имени переменной:
Производительность при использовании базовых типов данных
На современных машинах объекты базовых типов данных работают быстро, поэтому производительность при использовании этих типов обычно не должна быть проблемой.
В качестве отступления.
Урок №41. Условный тернарный оператор, оператор sizeof и Запятая
Обновл. 11 Сен 2021 |
На этом уроке мы рассмотрим условный тернарный оператор, оператор Запятую и вспомним оператор sizeof в языке C++.
Оператор sizeof
Мы уже рассматривали оператор sizeof на уроке №30.
Оператор | Символ | Пример | Операция |
sizeof | sizeof | sizeof(тип) sizeof(переменная) | Возвращает размер типа данных или переменной в байтах |
Тогда мы использовали его для определения размера конкретных типов данных. Но также sizeof можно использовать и с переменными:
Оператор Запятая
Оператор Запятая (или «оператор Comma») позволяет обрабатывать несколько выражений (в то время, когда, обычно, позволяется только одно).
Оператор | Символ | Пример | Операция |
Запятая | , | x, y | Вычисляется x, затем вычисляется y, а затем возвращается значение y |
Выражение, в котором находится этот оператор, будет иметь значение правого операнда. Например:
Почти в каждом случае, стейтмент, в котором есть оператор Запятая, лучше записывать в виде отдельных инструкций. Вышеприведенный код корректнее будет записать следующим образом:
Обратите внимание, оператор Запятая имеет самый низкий приоритет из всех операторов (даже ниже, чем в оператора присваивания), поэтому следующие две строки кода делают не одно и то же:
Большинство программистов не используют оператор Comma вообще (разве что только в циклах for).
Обратите внимание, запятая, которая используется в вызовах функций, не является оператором Comma:
Аналогично, при объявлении нескольких переменных в одной строке, запятая используется как разделитель, а не как оператор:
Правило: Избегайте использования оператора Comma (исключением являются циклы for).
Условный тернарный оператор
if (условие)
выражение;
else
другое_выражение;
Можно записать как:
Обратите внимание, операнды условного оператора должны быть выражениями (а не стейтментами).
Например, ветвление if/else, которое выглядит следующим образом:
if (условие)
x = значение1;
else
x = значение2;
Можно записать как:
Большинство программистов предпочитают последний вариант, так как он читабельнее.
Обычно, часть с условием помещают внутри скобок, чтобы убедиться, что приоритет операций корректно сохранен и так удобнее читать.
Или с помощью тернарного оператора:
Будет обрабатываться как:
Совет: Всегда заключайте в скобки условную часть тернарного оператора, а лучше весь тернарный оператор.
Условный тернарный оператор — это удобное упрощение ветвления if/else, особенно при присваивании результата переменной или возврате определенного значения. Но его не следует использовать вместо сложных ветвлений if/else, так как в таких случаях читабельность кода резко ухудшается и вероятность возникновения ошибок только растет.
Правило: Используйте условный тернарный оператор только в тривиальных случаях.
Условный тернарный оператор вычисляется как выражение
Электроника для всех
Блог о электронике
1.3.5. Операция sizeof
С помощью операции sizeof можно определить размер памяти которая соответствует идентификатору или типу. Операция sizeof имеет следующий формат:
Если в качестве выражения указанно имя массива, то результатом является размер всего массива (т.е. произведение числа элементов на длину типа), а не размер указателя, соответствующего идентификатору массива.
Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.
struct < char h; int b; double f; >str; int a1; a1 = sizeof(str);
Переменная а1 получит значение, равное 12, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.
Несоответствие имеет место в виду того, что после размещения в памяти первой переменной h длинной 1 байт, добавляется 1 байт для выравнивания адреса переменной b на границу слова (слово имеет длину 2 байта для машин серии IBM PC AT /286/287), далее осуществляется выравнивание адреса переменной f на границу двойного слова (4 байта), таким образом в результате операций выравнивания для размещения структуры в оперативной памяти требуется на 5 байт больше.
В связи с этим целесообразно рекомендовать при объявлении структур и объединения располагать их элементы в порядке убывания длины типов, т.е. приведенную выше структуру следует записать в следующем виде:
Оператор sizeof (C)
Оператор sizeof предоставляет объем хранения (в байтах), необходимого для хранения объекта типа «операнд». Этот оператор позволяет избежать задания зависимых от компьютера размера данных в программах.
Синтаксис
Примечания
Операнд является либо любым идентификатором unary-expression, либо выражением type-cas (то есть описателем типа, заключенным в скобки). unary-expression не может представлять объект битового поля, неполный тип или указатель функции. Результатом является целочисленная константа без знака. Стандартный заголовок STDDEF.H определяет этот тип как size_t.
При применении оператора sizeof к идентификатору массива результатом является размер целого массива, а не размер указателя, представленного идентификатором массива.
При применении оператора sizeof к имени структуры или типа объединения, идентификатору структуры или типа объединения, результатом является число байтов в структуре или объединении, включая внутреннее и конечное заполнение. Этот размер может включать внутреннее и конечное заполнение, используемое для выравнивания элементов структуры или объединения относительно границ памяти. Таким образом, результат может не соответствовать размеру, вычисленному путем добавления требований к хранению отдельных элементов.
Если безразмерный массив является последним элементом структуры, оператор sizeof возвращает размер структуры без массива.