Что такое куча и стек различия принцип работы

Основные принципы программирования: стек и куча

Авторизуйтесь

Основные принципы программирования: стек и куча

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Мы используем всё более продвинутые языки программирования, которые позволяют нам писать меньше кода и получать отличные результаты. За это приходится платить. Поскольку мы всё реже занимаемся низкоуровневыми вещами, нормальным становится то, что многие из нас не вполне понимают, что такое стек и куча, как на самом деле происходит компиляция, в чём разница между статической и динамической типизацией, и т.д. Я не говорю, что все программисты не знают об этих понятиях — я лишь считаю, что порой стоит возвращаться к таким олдскульным вещам.

Сегодня мы поговорим лишь об одной теме: стек и куча. И стек, и куча относятся к различным местоположениям, где происходит управление памятью, но стратегия этого управления кардинально отличается.

Стек — это область оперативной памяти, которая создаётся для каждого потока. Он работает в порядке LIFO (Last In, First Out), то есть последний добавленный в стек кусок памяти будет первым в очереди на вывод из стека. Каждый раз, когда функция объявляет новую переменную, она добавляется в стек, а когда эта переменная пропадает из области видимости (например, когда функция заканчивается), она автоматически удаляется из стека. Когда стековая переменная освобождается, эта область памяти становится доступной для других стековых переменных.

Из-за такой природы стека управление памятью оказывается весьма логичным и простым для выполнения на ЦП; это приводит к высокой скорости, в особенности потому, что время цикла обновления байта стека очень мало, т.е. этот байт скорее всего привязан к кэшу процессора. Тем не менее, у такой строгой формы управления есть и недостатки. Размер стека — это фиксированная величина, и превышение лимита выделенной на стеке памяти приведёт к переполнению стека. Размер задаётся при создании потока, и у каждой переменной есть максимальный размер, зависящий от типа данных. Это позволяет ограничивать размер некоторых переменных (например, целочисленных), и вынуждает заранее объявлять размер более сложных типов данных (например, массивов), поскольку стек не позволит им изменить его. Кроме того, переменные, расположенные на стеке, всегда являются локальными.

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

Куча — это хранилище памяти, также расположенное в ОЗУ, которое допускает динамическое выделение памяти и не работает по принципу стека: это просто склад для ваших переменных. Когда вы выделяете в куче участок памяти для хранения переменной, к ней можно обратиться не только в потоке, но и во всем приложении. Именно так определяются глобальные переменные. По завершении приложения все выделенные участки памяти освобождаются. Размер кучи задаётся при запуске приложения, но, в отличие от стека, он ограничен лишь физически, и это позволяет создавать динамические переменные.

13–15 декабря, Онлайн, Беcплатно

Вы взаимодействуете с кучей посредством ссылок, обычно называемых указателями — это переменные, чьи значения являются адресами других переменных. Создавая указатель, вы указываете на местоположение памяти в куче, что задаёт начальное значение переменной и говорит программе, где получить доступ к этому значению. Из-за динамической природы кучи ЦП не принимает участия в контроле над ней; в языках без сборщика мусора (C, C++) разработчику нужно вручную освобождать участки памяти, которые больше не нужны. Если этого не делать, могут возникнуть утечки и фрагментация памяти, что существенно замедлит работу кучи.

В сравнении со стеком, куча работает медленнее, поскольку переменные разбросаны по памяти, а не сидят на верхушке стека. Некорректное управление памятью в куче приводит к замедлению её работы; тем не менее, это не уменьшает её важности — если вам нужно работать с динамическими или глобальными переменными, пользуйтесь кучей.

Заключение

Вот вы и познакомились с понятиями стека и кучи. Вкратце, стек — это очень быстрое хранилище памяти, работающее по принципу LIFO и управляемое процессором. Но эти преимущества приводят к ограниченному размеру стека и специальному способу получения значений. Для того, чтобы избежать этих ограничений, можно пользоваться кучей — она позволяет создавать динамические и глобальные переменные — но управлять памятью должен либо сборщик мусора, либо сам программист, да и работает куча медленнее.

Источник

Стек, очередь и куча

На рисунке вы можете видеть обобщенную модель организации памяти компьютера.

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Стек — это область памяти, которую вы, как программист, не контролируете никоим образом. В неё записываются переменные и информация, которые создаются в результате вызова любых функций. Когда функция заканчивает работу, то вся информация о ее вызов и ее переменные удаляются из стека автоматически.

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Но важнее даже не это, а то, что стек — это структура данных, которая работает по принципу «последним пришел — первым ушел» (last in first out, LIFO). На лекции Дэвид предложил представление стека, как стопки подносов в столовой. Поднос, который попал в стопку последним, новый клиент столовой возьмет в первую очередь.

Над стеком можно осуществлять две операции: push (занесение данных) и pop (изъятие данных).

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Пример реализации стека языке С приведен ниже. В этом примере, стек — это просто массив строк, имеет определенную емкость (CAPACITY), и текущий размер (size):

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Для реализации операции pop, необходимо проверить, не пустой стек, уменьшить текущий размер на единицу и вернуть элемент.

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Очередь

Очередь (queue) — это структура данных, которая напоминает обычную очередь. То есть, в отличие от стека, она работает по принципу «первым пришел — первым ушел» (first in first out, FIFO).

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Для очереди определены две операции: добавление элемента в конец очереди (enqueue) и изъятие элемента с начала очереди (dequeue).

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

В примере объявлена очередь, которая, по сути, представляет собой массив строк:

Чтобы реализовать операцию enqueue, необходимо убедиться, что очередь, не переполнена, добавить элемент в конец очереди и увеличить текущий размер на единицу.

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Чтобы реализовать операцию dequeue, надо убедиться, что очередь не пуста, увеличить head на единицу, уменьшить текущий размер и вернуть первый элемент очереди.

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Куча и переполнение буфера

Куча (heap) — область памяти, которую контролируют непосредственно программисты. Над которой вы, как программисты, получаете непосредственный контроль. Память здесь выделяется в результате вызова функции malloc.

Более глубокие знания о стеке и куче вам пока не понадобятся. Вы их получите позже, если захотите изучать программирование и компьютерные науки глубже.

Буфер — это массив определенной длины, расположенный в памяти. Переполнение буфера (buffer overflow) возникает, если мы пытаемся записать в него больше данных, чем предусмотрено размером этого массива. С помощью переполнения буфера злоумышленник может записать опасный код в память компьютера.

Источник

Стек и куча 2021

Управление памятью является фундаментальным явлением операционной системы, используемой для обработки или управления первичной памятью, чтобы контролировать права доступа к памяти на компьютере. Цель состоит в том, чтобы предотвратить доступ любого процесса к памяти, которая еще не была ему выделена.

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

Оба они хранятся в ОЗУ компьютера, и они могут расти и сокращаться во время выполнения программы. Давайте обсудим эти два в деталях и сравним их, чтобы понять, какой из них лучше.

Что такое стек?

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Что такое куча?

Куча относится к большому пулу памяти, используемому для распределения динамической памяти, что означает, что память остается выделенной до тех пор, пока программа не будет завершена или память не будет освобождена. Память распределяется случайным образом, поэтому нет простого доступа к памяти. В отличие от сегмента стека, элементы освобождаются в обратном порядке, поскольку они были изначально выделены. Проще говоря, память выделяется программам по запросу и освобождается, когда их больше не требуется. Элементы кучи независимо друг от друга означают, что к ним можно получить доступ, когда программа запускается и освобождается, когда программа завершается. Это как глобальный пул памяти, используемый для хранения глобальных переменных и многих переменных, ссылающихся на него.

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Разница между стеком и кучей

Значение стека и кучи

В компьютерной архитектуре стек представляет собой специальную область памяти компьютера, явно выделенную для автоматических переменных. В программировании автоматическая переменная является локальной переменной, означающей, что область действия переменной локальна для блока, в котором она объявлена. Память автоматически присваивается этим переменным при входе в блок, и память освобождается после выхода. С другой стороны, куча представляет собой часть памяти компьютера, используемую для распределения динамической памяти, что означает, что блоки памяти распределяются и де-распределяются случайным образом.

Распределение памяти для стека и кучи

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

Доступ к стеку и куче

Стек управляется и оптимизируется процессором, и доступ к данным осуществляется в порядке последней очереди (LIFO). LIFO относится к способу хранения данных в пакетах памяти, в котором первый блок памяти является первым, который будет освобожден, и наоборот. Это обеспечивает эффективное управление памятью. Элементы кучи, напротив, не зависят друг от друга, и доступ к данным возможен произвольно, так как блок памяти может быть выделен и освобожден в любое время, независимо от их порядка. В отличие от стеков, кучи не имеют определенного шаблона для выделения и освобождения блоков памяти.

Переменные в стеке и куче

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

Стек против кучи: сравнительная таблица

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Резюме стека против кучи

Оба являются наиболее распространенными способами распределения памяти и хранятся в оперативной памяти компьютера для эффективного управления памятью. Однако доступ к памяти в стеке выполняется быстро, потому что память управляется автоматически, тогда как в куче память должна управляться вручную, что означает, что вам нужно самостоятельно выделять свободную память, когда блоки больше не нужны. Стек, очевидно, быстрее и проще в использовании благодаря своей гибкости, но он имеет свою долю плюсов и минусов. Хотя стек не имеет ограничений по размеру памяти, его немного сложно реализовать.Куча медленнее, чем стек, но его реализация проще.

Источник

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Разделение памяти

Куча для обработки данных

*примечание: в случае массивов для данных типа double существует исключение, согласно которому они хранятся в большой объектной куче задолго до достижения размера в 85 кб (double[] считается системой «большим» объектом при достижении размера в 1000 элементов). По отношению к оптимизации 32-битного кода это, конечно, не очень хорошо.

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

Элементы, размещенные в кучи, обладают своими адресами, которые являются чем-то вроде указателей на ячейки памяти, где хранятся значения этих элементов.

Стек

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Тема связана со специальностями:

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Стек используется для хранения порядка выполнения кода и часто называется стеком вызова, стеком выполнения или программным стеком.

Давайте взглянем на следующий участок кода:

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

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

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Также вы можете увидеть, что происходит, когда Method3 завершает свое выполнение (стек-фрейм покидает стек вызова).

Хранение значимых типов

Видео курсы по схожей тематике:

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

C# Базовый (ООП) 2021

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

How to C# Углубленный

Куча

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

Хранение ссылочных типов

Рассмотрим следующий код:

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Фигура ниже иллюстрирует, как выглядит стек и куча в плане хранения данных:

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

OBJREF, хранимый в стеке, на самом деле является ссылкой на объект MyClass, хранимый в куче.

Заметка: выражение MyClass myObj совершенно не занимает места в куче переменной myObj. Здесь всего лишь создается переменная OBJREF в стеке, после чего она инициализируется значением null. Как только выполняется команда new, куча получает действительное место памяти объекта, а сам ссылочный объект получает по адресу свое значение.

Значимые типы против ссылочных типов (стек против кучи)

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

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Как уже и было сказано, в случае со ссылочными типами данных, при присваивании ссылочному типу данных значения другого ссылочного типа данных, происходит присваивания адреса, тогда как ячейка памяти со значением остается прежней.

Бесплатные вебинары по схожей тематике:

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Практика C#. Создание блога с Blogifier.Core

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Создание эволюционной игры Conway’s Game Of Life на C# + WPF

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

Конечно, хранение одного вида информации в стеке, другого в куче, имеет свои причины, которые мы рассмотрим в грядущих статьях. 🙂

Заключение

Источник

Разбираемся с управлением памятью в современных языках программирования

Привет, Хабр! Представляю вашему вниманию перевод статьи «Demystifying memory management in modern programming languages» за авторством Deepu K Sasidharan.

В данной серии статей мне бы хотелось развеять завесу мистики над управлением памятью в программном обеспечении (далее по тексту — ПО) и подробно рассмотреть возможности, предоставляемые современными языками программирования. Надеюсь, что мои статьи помогут читателю заглянуть под капот этих языков и узнать для себя нечто новое.

Углублённое изучение концептов управления памятью позволяет писать более эффективное ПО, потому как стиль и практики кодирования оказывают большое влияние на принципы выделения памяти для нужд программы.

Часть 1: Введение в управление памятью

Управление памятью — это целый набор механизмов, которые позволяют контролировать доступ программы к оперативной памяти компьютера. Данная тема является очень важной при разработке ПО и, при этом, вызывает затруднения или же вовсе остаётся черным ящиком для многих программистов.

Для чего используется оперативная память?

Когда программа выполняется в операционный системе компьютера, она нуждается в доступе к оперативной памяти (RAM) для того, чтобы:

Стек используется для статичного выделения памяти. Он организован по принципу «последним пришёл — первым вышел» (LIFO). Можно представить стек как стопку книг — разрешено взаимодействовать только с самой верхней книгой: прочитать её или положить на неё новую.

Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы
Использование стека в JavaScript. Объекты хранятся в куче и доступны по ссылкам, которые хранятся в стеке. Тут можно посмотреть в видеоформате

Куча используется для динамического выделения памяти, однако, в отличие от стека, данные в куче первым делом требуется найти с помощью «оглавления». Можно представить, что куча это такая большая многоуровневая библиотека, в которой, следуя определённым инструкциям, можно найти необходимую книгу.

Почему эффективное управление памятью важно?

В отличие от жёстких дисков, оперативная память весьма ограниченна (хотя и жёсткие диски, безусловно, тоже не безграничны). Если программа потребляет память не высвобождая её, то, в конечном итоге, она поглотит все доступные резервы и попытается выйти за пределы памяти. Тогда она просто упадет сама, или, что ещё драматичнее, обрушит операционную систему. Следовательно, весьма нежелательно относиться легкомысленно к манипуляциям с памятью при разработке ПО.

Различные подходы

Современные языки программирования стараются максимально упростить работу с памятью и снять с разработчиков часть головной боли. И хотя некоторые почтенные языки всё ещё требуют ручного управления, большинство всё же предоставляет более изящные автоматические подходы. Порой в языке используется сразу несколько подходов к управлению памятью, а иногда разработчику даже доступен выбор какой из вариантов будет эффективнее конкретно для его задач (хороший пример — C++). Перейдём к краткому обзору различных подходов.

Ручное управление памятью

Язык не предоставляет механизмов для автоматического управления памятью. Выделение и освобождение памяти для создаваемых объектов остаётся полностью на совести разработчика. Пример такого языка — C. Он предоставляет ряд методов (malloc, realloc, calloc и free) для управления памятью — разработчик должен использовать их для выделения и освобождения памяти в своей программе. Этот подход требует большой аккуратности и внимательности. Так же он является в особенности сложным для новичков.

Сборщик мусора

Сборка мусора — это процесс автоматического управления памятью в куче, который заключается в поиске неиспользующихся участков памяти, которые ранее были заняты под нужды программы. Это один из наиболее популярных вариантов механизма для управления памятью в современных языках программирования. Подпрограмма сборки мусора обычно запускается в заранее определённые интервалы времени и бывает, что её запуск совпадает с ресурсозатратными процессами, в результате чего происходит задержка в работе приложения. JVM (Java/Scala/Groovy/Kotlin), JavaScript, Python, C#, Golang, OCaml и Ruby — вот примеры популярных языков, в которых используется сборщик мусора.

Получение ресурса есть инициализация (RAII)

RAII — это программная идиома в ООП, смысл которой заключается в том, что выделяемая для объекта область памяти строго привязывается к его времени существования. Память выделяется в конструкторе и освобождается в деструкторе. Данный подход был впервые реализован в C++, а так же используется в Ada и Rust.

Автоматический подсчёт ссылок (ARC)

Данный подход весьма похож на сборку мусора с подсчётом ссылок, однако, вместо запуска процесса подсчёта в определённые интервалы времени, инструкции выделения и освобождения памяти вставляются на этапе компиляции прямо в байт-код. Когда же счётчик ссылок достигает нуля, память освобождается как часть нормального потока выполнения программы.

Автоматический подсчёт ссылок всё так же не позволяет обрабатывать циклические ссылки и требует от разработчика использования специальных ключевых слов для дополнительной обработки таких ситуаций. ARC является одной из особенностей транслятора Clang, поэтому присутствует в языках Objective-C и Swift. Так же автоматический подсчет ссылок доступен для использования в Rust и новых стандартах C++ при помощи умных указателей.

Владение

Это сочетание RAII с концепцией владения, когда каждое значение в памяти должно иметь только одну переменную-владельца. Когда владелец уходит из области выполнения, память сразу же освобождается. Можно сказать, что это примерно как подсчёт ссылок на этапе компиляции. Данный подход используется в Rust и при этом я не смог найти ни одного другого языка, который бы использовал подобный механизм.
Что такое куча и стек различия принцип работы. Смотреть фото Что такое куча и стек различия принцип работы. Смотреть картинку Что такое куча и стек различия принцип работы. Картинка про Что такое куча и стек различия принцип работы. Фото Что такое куча и стек различия принцип работы

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

Читайте так же другие части серии:

Ссылки

Вы можете подписаться на автора статьи в Twitter и на LinkedIn.

Источник

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

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