logo

Розподіл пам'яті стека чи купи

Пам'ять у програмі C/C++/Java може бути виділена або в стек, або в купу.
Необхідна умова: Розташування пам'яті програми на Сі .


Розподіл стеку: Розподіл відбувається на безперервних блоках пам’яті. Ми називаємо це розподілом пам’яті стека, тому що розподіл відбувається в стеку викликів функцій. Розмір пам’яті, який буде виділено, відомий компілятору, і щоразу, коли викликається функція, її змінні отримують пам’ять, виділену в стеку. І кожного разу, коли виклик функції завершується, пам’ять для змінних звільняється. Все це відбувається за допомогою деяких попередньо визначених процедур у компіляторі. Програмісту не потрібно турбуватися про виділення пам'яті та скасування розподілу змінних стека. Такий вид розподілу пам’яті також відомий як тимчасовий розподіл пам’яті, оскільки, як тільки метод завершує своє виконання, усі дані, що належать цьому методу, автоматично очищаються зі стеку. Це означає, що будь-яке значення, що зберігається в схемі стекової пам’яті, доступне до тих пір, поки метод не завершив своє виконання і наразі перебуває у запущеному стані.



випадковий порядок sql

Ключові моменти:

  • Це схема тимчасового розподілу пам’яті, де члени даних доступні, лише якщо метод(), який їх містить, наразі запущено.
  • Він автоматично розподіляє або скасовує пам'ять, щойно відповідний метод завершить своє виконання.
  • Отримуємо відповідну помилку Java. мова StackOverFlowError за JVM , Якщо стекова пам'ять заповнена повністю.
  • Розподіл пам'яті стека вважається безпечнішим порівняно з розподілом пам'яті купи, оскільки доступ до збережених даних може мати лише потік-власник.
  • Розподіл пам’яті та звільнення від нього відбуваються швидше порівняно з розподілом пам’яті Heap.
  • Стекова пам'ять має менше місця для зберігання в порівнянні з куповою пам'яттю.
C++
int main() {  // All these variables get memory  // allocated on stack  int a;  int b[10];  int n = 20;  int c[n]; }>


Розподіл купи: Пам'ять виділяється під час виконання інструкцій, написаних програмістами. Зауважте, що купа імен не має нічого спільного з витік пам'яті може статися в програмі.



Розподіл пам'яті купи далі поділяється на три категорії: - Ці три категорії допомагають нам визначити пріоритетність даних (об’єктів), які будуть зберігатися в купі пам’яті або в Вивіз сміття .

починається з java
  • Молоде покоління – Це частина пам’яті, де всі нові дані (об’єкти) створюються для розподілу простору, і щоразу, коли ця пам’ять повністю заповнюється, решта даних зберігається в збірці сміття.
  • Старе або старше покоління – Це частина пам’яті Heap, яка містить старі об’єкти даних, які не використовуються часто або не використовуються взагалі.
  • Постійне покоління – Це частина пам’яті Heap, яка містить метадані JVM для класів середовища виконання та методів програми.

Ключові моменти:

  • Ми отримуємо відповідне повідомлення про помилку, якщо Heap-простір повністю заповнений, java. lang.OutOfMemoryError від JVM.
  • Ця схема розподілу пам’яті відрізняється від розподілу стекового простору, тут функція автоматичного скасування виділення не передбачена. Для ефективного використання пам’яті нам потрібно використовувати збірник сміття, щоб видалити старі невикористані об’єкти.
  • Час обробки (час доступу) цієї пам’яті досить повільний порівняно зі стековою пам’яттю.
  • Пам'ять купи також не є такою потоково-безпечною, як стекова пам'ять, оскільки дані, що зберігаються в пам'яті купи, видимі для всіх потоків.
  • Розмір динамічної пам'яті значно більший у порівнянні зі стековою пам'яттю.
  • Пам'ять купи доступна або існує, доки працює вся програма (або програма Java).
CPP
int main() {  // This memory for 10 integers  // is allocated on heap.  int *ptr = new int[10]; }>

Змішаний приклад обох типів розподілу пам’яті Heap і Stack в java:



C++
#include  using namespace std; int main() {  int a = 10; // stored in stack  int* p = new int(); // allocate memory in heap  *p = 10;  delete (p);  p = new int[4]; // array in heap allocation  delete[] p;  p = NULL; // free heap  return 0; }>
Java
class Emp {  int id;  String emp_name;  public Emp(int id, String emp_name) {  this.id = id;  this.emp_name = emp_name;  } } public class Emp_detail {  private static Emp Emp_detail(int id, String emp_name) {  return new Emp(id, emp_name);  }  public static void main(String[] args) {  int id = 21;  String name = 'Maddy';  Emp person_ = null;  person_ = Emp_detail(id, name);  } }>
Python
def main(): a = 10 # stored in stack p = None # declaring p variable p = 10 # allocating memory in heap del p # deleting memory allocation in heap p = [None] * 4 # array in heap allocation p = None # free heap return 0 if __name__ == '__main__': main()>
Javascript
// Define the Emp class with id and emp_name properties class Emp {  constructor(id, emp_name) {  this.id = id; // Initialize id  this.emp_name = emp_name; // Initialize emp_name  } } // Create an instance of the Emp class const person = new Emp(21, 'Maddy'); // Initialize person with id 21 and emp_name 'Maddy' console.log(person); // Output the person object to the console>

Проаналізувавши наведений вище приклад, ми зробимо такі висновки:

if else if java
  • Коли ми починаємо виконання програми have, усі класи часу виконання зберігаються в просторі пам’яті купи.
  • Потім ми знаходимо метод main() у наступному рядку, який зберігається в стеку разом із усіма його примітивами (або локальними), і посилальна змінна Emp типу Emp_detail також буде збережена в стеку та вказуватиме на відповідний об’єкт зберігається в пам’яті Heap.
  • Тоді наступний рядок викличе параметризований конструктор Emp(int, String) з main(), і він також виділить верхню частину того самого блоку пам’яті стеку. Це зберігатиме:
    • Посилання на об’єкт викликаного об’єкта стекової пам’яті.
    • Первісне значення ( Посилальна змінна аргументу String emp_name вказуватиме на фактичний рядок із пулу рядків у пам’ять купи.
  • Тоді основний метод знову викличе статичний метод Emp_detail(), для якого буде зроблено виділення в блоці пам’яті стека поверх попереднього блоку пам’яті.
  • Посилальна змінна аргументу String emp_name вказуватиме на фактичний рядок із пулу рядків у пам’ять купи.
  • Отже, для щойно створеного об’єкта Emp типу Emp_detail і всі змінні екземпляра будуть зберігатися в пам’яті купи.
  • Посилальна змінна аргументу String emp_name вказуватиме на фактичний рядок із пулу рядків у пам’ять купи.

  • Ілюстраційне представлення, як показано на рисунку 1 нижче:

    Посилальна змінна аргументу String emp_name вказуватиме на фактичний рядок із пулу рядків у пам’ять купи.
  • Рис.1

    Ключові відмінності між розподілом стека та купи

    1. У стеку виділення та скасування виділення автоматично виконується компілятором, тоді як у купі це має робити програміст вручну.
    2. Обробка кадру купи є дорожчою, ніж робота зі стеком.
    3. Проблема нестачі пам’яті, швидше за все, виникає в стеку, тоді як основною проблемою в пам’яті купи є фрагментація.
    4. Доступ до кадру стека легший, ніж кадру купи, оскільки стек має невелику область пам’яті та є дружнім до кешу, але у випадку кадрів купи, які розосереджені по пам’яті, це спричиняє більше промахів кешу.
    5. Стек не є гнучким, розмір виділеної пам’яті не можна змінити, тоді як купа є гнучкою, і виділену пам’ять можна змінити.
    6. Час доступу до купи займає більше, ніж стека.

    Порівняльна таблиця

    ПараметрСТЕККУЧА
    БазовийПам'ять розподіляється в безперервному блоці.Пам'ять виділяється в довільному порядку.
    Розподіл і де-розподілАвтоматично за інструкціями компілятора.Інструкція програміста.
    Вартістьменшебільше
    Реалізаціялегковажко
    Час доступуШвидшеПовільніше
    Головне питанняДефіцит пам'ятіФрагментація пам'яті
    Місцевість посиланняЧудовоАдекватний
    БезпекаПотік безпечний, доступ до збережених даних може мати лише власникНебезпечно для потоків, збережені дані видимі для всіх потоків
    ГнучкістьФіксований розмірМожлива зміна розміру
    Структура типу данихЛінійнийІєрархічний
    БажаноСтатичний розподіл пам’яті є кращим у масиві.Розподіл пам’яті купи є кращим у зв’язаному списку.
    РозмірНевеликий, ніж купа пам'яті.Більше, ніж стекова пам'ять.