Урок №30. Размер типов данных

  Юрий  | 

    | 

  Обновл. 15 Июл 2019  | 

 19306

 ǀ   3 

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

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

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

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

Вот результат с моего компьютера:

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. Мы его использовали для выравнивания столбцов. Детальнее об этом мы ещё поговорим в соответствующих уроках.

Интересно то, что sizeof — это один из трёх операторов в C++, который является словом, а не символом (ещё есть new и delete).

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

Результат выполнения программы выше:

x is 4 bytes

В следующих уроках этой главы мы рассмотрим каждый из фундаментальных типов данных в С++ по отдельности.


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

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (222 оценок, среднее: 4,95 из 5)
Загрузка...

Комментариев: 3

  1. Аватар natovan:

    Странно, у меня long и long long имеют 8 байт. Получается, использовать long long нет смысла.

    1. Аватар Бубушян:

      Чем больше long, тем больше вес болта, смекаешь, дружище

      1. Аватар Илья:

        Встретимся на экзамене, шутник

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

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