Урок №33. Розмір типів даних

  Юрій  | 

  Оновл. 22 Лип 2021  | 

 255

Як ми вже знаємо з уроку №31, пам’ять на сучасних комп’ютерах, як правило, організована в блоки, які складаються з байтів, причому кожен блок має свою унікальну адресу. До цього моменту, пам’ять можна було порівнювати з поштовими скриньками (ті, які знаходяться в кожному під’їзді), куди ми можемо помістити інформацію і звідки ми її можемо витягти, а змінні — це всього лише номери цих поштових скриньок.

Проте, ця аналогія не зовсім підходить до програмування, так як змінні можуть займати більше 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++ гарантує тільки їх мінімальний розмір:

Тип Мінімальний розмір
Логічний тип даних 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 Зірок (7 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

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