Урок 30. Размер переменных. Оператор sizeof

   ⁄ 

 Обновлено 17 Апр 2017

  ⁄   

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

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

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

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

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-ным количеством битов может иметь 2n (2 в степени n, пишется 2^n) возможных значений. Поскольку байт состоит из 8 битов, то он может иметь 28 (256) возможных значений.

Размер переменной накладывает ограничения на количество информации, которую она может хранить — переменные, которые используют больше байтов, соответственно, могут хранить более широкий диапазон значений.

Во-вторых, компьютеры имеют ограниченное количество свободной памяти. Каждый раз, когда мы объявляем переменную, небольшая часть этой свободной памяти выделяется до тех пор, пока переменная существует. Поскольку современные компьютеры имеют много памяти, то в большинстве случаев – это не проблема, особенно когда в программе всего лишь несколько переменных. Тем не менее, для программ, которые требуют большого количества переменных (например, 100 000), разница между использованием 1-байтовых или 8-байтовых переменных может быть значительной.

Размер основных типов данных в C++

Следует очевидный вопрос: «Сколько памяти переменные разных типов занимают?». Вы можете удивиться, но размер определенных типов данных зависит от компилятора и/или архитектуры компьютера!

C++ гарантирует только их минимальный размер:

Категория Тип Минимальный размер Примечание
boolean bool 1 байт
character char 1 байт
wchar_t 1 байт
char16_t 2 байта тип C++11
char32_t 4 байта тип C++11
integer short 2 байта Может быть signed или unsigned
int 2 байта
long 4 байта
long long 8 байтов тип C99/C++11
floating point float 4 байта
double 8 байтов
long double 8 байтов

Фактический размер переменных может отличаться на разных компьютерах. Для того, чтобы определить размер типа данных на определенной машине, в C++ и есть оператор sizeof. sizeof – это унарный оператор, который вычисляет и возвращает размер в байтах переменной или типа данных. Вы можете скомпилировать и запустить следующую программу, чтобы выяснить, сколько занимают разные типы данных на вашем компьютере:

Вот результат с компьютера автора (архитектура x64), IDE — Visual Studio 2013:

bool:           1 bytes
char:           1 bytes
wchar_t:        2 bytes
char16_t:       2 bytes
char32_t:       4 bytes
short:          2 bytes
int:            4 bytes
long:           4 bytes
long long:      8 bytes
float:          4 bytes
double:         8 bytes
long double:    8 bytes

Ваши результаты могут отличаться, если у вас другая архитектура, или другой компилятор. Обратите внимание, что оператор sizeof не используется для типа void, так как последний не имеет размера.

Если вам интересно, что значит ‘\t’ в коде выше, то это специальный символ, который используется вместо TAB (вставляет пропуск). Мы его использовали для выравнивания столбцов. Мы рассмотрим ‘\t’ и другие специальные символы, когда будем изучать символьный тип данных char.

Интересно, что sizeof — это один из трех операторов в C++, который является словом, а не символом. Два другие оператора – это new и delete.

Вы также можете использовать оператор sizeof и с переменной:

x is 4 bytes

Мы рассмотрим размеры разных типов данных в следующих уроках этой главы.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (25 оценок, среднее: 4,92 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *