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

Автор: Laura McKinney
Дата создания: 1 Апрель 2021
Дата обновления: 13 Май 2024
Anonim
C# Стек и Куча | Stack and Heap | Часть 1
Видео: C# Стек и Куча | Stack and Heap | Часть 1

Содержание


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

Скорость является основным параметром, который различает стек и кучу; стек значительно быстрее, чем куча.

  1. Сравнительная таблица
  2. Определение
  3. Ключевые отличия
  4. Вывод

Сравнительная таблица

Основа для сравнениястекотвал
основнойПамять выделяется в (LIFO) режиме «последним первым делом».Память выделяется в случайном порядке.
Распределение и выделениеавтоматическаяРуководство по эксплуатации
СтоимостьМеньшеБольше
РеализацияЖесткийЛегко
ВызовНА)O (1)
вопросНехватка памятиФрагментация памяти
Местонахождение ссылкиПревосходноадекватный
гибкостьФиксированный размер и не гибкийИзменение размера возможно
Время доступаБыстрееПомедленнее


Определение стека

Распределение стеков следует стратегии LIFO («Последний пришел - первым вышел») для выделения памяти процессам с помощью операций push и pop. Каждый блок в памяти имеет фиксированный размер, который не может быть расширен или сокращен. Последняя запись в стеке доступна в любой момент. Стек использует непрерывную память, где указатель, названный в качестве базового стека, указывает на первую запись стека, а другой указатель, названный как верхняя часть стека, указывает на последнюю запись стека.

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

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


Определение кучи

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

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

  1. В стеке распределение и освобождение выполняются центральным процессором и выполняется автоматически, тогда как в куче программист должен делать это вручную.
  2. Обработка кадров кучи обходится дороже, чем обработка кадров стека.
  3. Реализация стека сложна. В отличие от этого, реализация кучи проста.
  4. Вызов функции в стеке занимает O (N) времени. В отличие от этого, требуется куча O (1) времени.
  5. Реализация стека в основном страдает от нехватки памяти. Напротив, основной проблемой в куче является фрагментация.
  6. Доступ к кадру стека проще, чем кучи, поскольку стек ограничен небольшой областью памяти и всегда попадает в кэш, но кадры кучи разбросаны по всей памяти, поэтому доступ к памяти может привести к большему количеству пропусков кеша.
  7. Стек не гибкий, выделенный объем памяти изменить нельзя. С другой стороны, куча является гибкой, и выделенная память может быть изменена.
  8. Куча требует больше времени доступа, чем стек.

Вывод

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