Що таке стек?
Стек - це спеціальна область пам’яті комп’ютера, яка зберігає тимчасові змінні, створені функцією. У стеку змінні оголошуються, зберігаються та ініціалізуються під час виконання.
Це пам’ять тимчасового зберігання. Коли обчислювальне завдання буде виконано, пам’ять змінної буде автоматично стерто. Розділ стека здебільшого містить методи, локальну змінну та посилальні змінні.
У цьому підручнику ви дізнаєтесь,
- Що таке стек?
- Що таке купа?
- Основні відмінності між стеком і купою
- Переваги використання Stack
- Переваги використання Heap
- Недоліки використання Stack
- Недоліки використання Heap
- Коли використовувати купу або стек?
Що таке купа?
Купа - це пам’ять, що використовується мовами програмування для зберігання глобальних змінних. За замовчуванням усі глобальні змінні зберігаються в купі пам'яті. Він підтримує динамічне виділення пам'яті.
Купа не управляється автоматично для вас і не так жорстко управляється процесором. Це більше схоже на вільно плаваючу область пам'яті.
КЛЮЧОВА РІЗНИЦЯ
- Стек - це лінійна структура даних, тоді як Heap - це ієрархічна структура даних.
- Пам'ять стека ніколи не стане фрагментованою, тоді як пам'ять купи може стати фрагментованою, оскільки блоки пам'яті спочатку виділяються, а потім звільняються.
- Стек отримує доступ до локальних змінних лише тоді, коли Heap дозволяє отримати доступ до змінних глобально.
- Змінні стека не можуть бути змінені, тоді як змінні купи можуть бути змінені.
- Пам'ять стека виділяється в суміжний блок, тоді як пам'ять купи виділяється в будь-якому випадковому порядку.
- Стек не вимагає де-розподілу змінних, тоді як у Heap необхідне де-розподіл.
- Розподіл стека та вивільнення здійснюються за вказівками компілятора, тоді як розподіл та вивільнення купи виконується програмістом.
Основні відмінності між стеком і купою
Параметр | Стек | Купи |
---|---|---|
Тип структур даних | Стек - це лінійна структура даних. | Купи - це ієрархічна структура даних. |
Швидкість доступу | Швидкісний доступ | Повільніше порівняно зі стеком |
Управління космосом | Простір, яким ефективно керує ОС, тому пам’ять ніколи не стане фрагментованою. | Простір купи не використовується настільки ефективно. Пам'ять може стати фрагментованою, оскільки блоки пам'яті спочатку виділяються, а потім звільняються. |
Доступ | Тільки локальні змінні | Це дозволяє отримати доступ до змінних у всьому світі. |
Обмеження простору | Обмеження розміру стека залежно від ОС. | Не має конкретного обмеження на обсяг пам'яті. |
Змінити розмір | Змінні не можна змінити | Змінні можна змінювати. |
Виділення пам'яті | Пам'ять виділяється в суміжний блок. | Пам'ять виділяється в довільному порядку. |
Розподіл та перерозподіл | Автоматично виконується інструкціями компілятора. | Це робиться програмістом вручну. |
Розмежування | Не вимагає де-розподілу змінних. | Потрібне явне де-розподіл. |
Вартість | Менше | Більше |
Впровадження | Стек можна реалізувати трьома способами на основі простого масиву, використовуючи динамічну пам’ять та пов’язаний список. | Купа може бути реалізована за допомогою масиву та дерев. |
Основне питання | Нестача пам’яті | Фрагментація пам'яті |
Місцевість посилання | Автоматичні інструкції часу компіляції. | Адекватний |
Гнучкість | Фіксований розмір | Зміна розміру можлива |
Час доступу | Швидше | Повільніше |
Переваги використання Stack
Ось плюси / переваги використання стека:
- Допомагає керувати даними методом Last In First Out (LIFO), що неможливо за допомогою пов’язаного списку та масиву.
- Коли функцію викликають, локальні змінні зберігаються у стеку, і вона автоматично знищується після повернення.
- Стек використовується, коли змінна не використовується поза цією функцією.
- Це дозволяє контролювати розподіл та вивільнення пам'яті.
- Стек автоматично очищає об'єкт.
- Не легко пошкоджується
- Змінні не можна змінити.
Переваги використання Heap
Плюси / переваги використання кучевої пам'яті:
- Купи допомагає знайти найбільше і мінімальне число
- Збір сміття виконується в купі пам’яті, щоб звільнити пам’ять, що використовується об’єктом.
- Метод купи також використовується у черзі пріоритетів.
- Це дозволяє отримати доступ до змінних у всьому світі.
- Куча не має обмежень на обсяг пам'яті.
Недоліки використання Stack
Мінуси / недоліки використання пам'яті стека:
- Пам'ять стека дуже обмежена.
- Створення занадто багато об’єктів у стеку може збільшити ризик переповнення стека.
- Випадковий доступ неможливий.
- Змінна пам’ять буде перезаписана, що іноді призводить до невизначеної поведінки функції або програми.
- Стек випаде за межі області пам'яті, що може призвести до ненормального завершення роботи.
Недоліки використання Heap
Мінуси / недоліки використання пам'яті Heaps:
- Він може забезпечити максимальну пам’ять, яку може надати ОС
- Для обчислення потрібно більше часу.
- Управління пам'яттю є складнішим у купі пам’яті, оскільки воно використовується в усьому світі.
- Це займає занадто багато часу на виконання порівняно зі стеком.
Коли використовувати купу або стек?
Вам слід використовувати купу, коли вам потрібно виділити великий блок пам'яті. Наприклад, ви хочете створити масив великих розмірів або велику структуру, щоб зберегти цю змінну довгий час, тоді вам слід розподілити її в купі.
Однак якщо ви працюєте з відносно невеликими змінними, які потрібні лише до тих пір, поки функція, що їх використовує, не оживає. Потім потрібно скористатися стеком, що швидше і простіше.