Основные принципы программирования: стек и куча. Pgm37 — Двоичная куча и быстрые сортировки Как называется куча

Чего-либо, обычно сыпучего, мелкого, наваленного, насыпанного в одном местечего-либо.

  • Куча песка.
  • Его одежда валялась на полу бесформенной кучей .
  • разговорный. беспорядочное людей, животных, автомобилей и т. п..
    • Не представляю, как люди жили в коммуналках в одной куче , дети, однако же, были, и много детей, все делали в спешке, где уж тут до взаимной психотерапии, подготовки, ласк, слов.
  • большое чего-либо.
    • Эта шуба кучу денег стоит!
  • мужское и женское .
    • Моего друга зовут Куча .
    • Мою подругу зовут Куча .
  • "Холм" после разгрузки самосвала
  • "подождет ваша... дел"
  • ... мала
  • в информатике и программировании регион зарезервированного адресного пространства, условное название структуры данных, поверх которой реализована динамическая память приложения
  • вещи горой
  • ворох
  • ворох хлама
  • глобальная единица счета навоза
  • гора хлама
  • горка листьев
  • горка навоза
  • груда
  • груда барахла
  • груда мусора
  • груда снега
  • груда, которая мала
  • груда, навал
  • дворовая игра "... мала"
  • детская игра "...-мала"
  • единица счета навоза
  • ж. груда, вброх, громада, вещи горой; толпа, сборище; *много; новг. твер. копна сена. Моск. количество скота, выгоняемого от одного хозяина в стадо. Саженные кучи щебня. Куча людей, народа. На мне куча забот. Муравьиная куча. муравейник. Комком да в кучку, на скорую (на крестьянскую ручку.) Велика куча (денег) не надокучит. Была кучка, стал ворошек, прикопили. На чужую кучу нечего глаза пучить. Комком да в кучку, да под леву ручку. Смотрит в кучку, а глядит врознь! Народ глуп: все в кучу лезет. По кучке, все онучки; а станешь считать, одной нет! Галичане в кучу, костромичи в кучу, ярославцы прочь, или врознь: от междоусобии Шемяки с Шуйским. Сиб. заводе, количество уголья, выходящего в один раз из печи. Класть кучи, жечь угодье. Сиб. последняя пора беременности. Даль вам Бог кого? Нет, еще жена в куча. Кучки мн. умалит. ниж. созвездие плеяд, утиное гнездо, бабы, стожары. Южн. зап. еврейский праздник пасхи (см. куща). Кучный, кучевой, кучечный, к кучкам относящ. Кучный заряд портит дичь. Народ кучно стоит, густо, толпою. Кучевые облака. Кучистый, кучковатый, состоящий из куч, усеянный кучками. Кученок м. небольшая угольная куча, в которой недоспевший при первом пережиге уголь (головни) дожигается. Кучегур м. кучегуры мн. южн. песчаные бугры, сыпучие кочки, шиханы, бараканы. Кучеклад спб. угольщик. Кучить что, кучивать, сбирать, складывать, сгребать в кучи, вороха. Кучить чем, новг. торговать по мелочи, кучить калачами, квасом. Кучить картофель, огребать, окучивать. -ся, быть скучиваему, складываему в кучи; толпиться в кучу. Моржи кучатся арх. вылезают юровом (стаей) на лед и сходятся. кому, о чем, сев. вост. просить неотступно, униженно, кланяться, умолять, конаться, домогаться, докучать (докука). Пучился, мучился, а докучился, так кинул. Кучился, мучился, а упросил, так бросил. Мучится, а никому не кучится. Вскучил волосы. Вкучился, влез в кучу. Крот выкучил землю. Докучивай картофель. Накучили много. Окучивай его. Подкучивай сбоку. Стрелки скучились. Покучься соседу. Вскучишься, как беда придет. Насилу рубля докучился. Закучился, закланялся. Накучился, накланялся. Кученье ср. действ. по глаг. на ть и на ся. Кучка ж. об. действ. по глаг. кучить и умалит. куча. Строить кучки, у стрелков, сбегаться из рассыпного строя в кучки, при налете конницы. Кучкать что, комкать, складывать или свертывать, сминать в кучу. Кучкаться казач. толпиться, сбиваться в кучу, куриться, усаживаться тесно. Кучкаться или тул. кучать, медлить, мешкать, копаться. Что там кучаешь
  • и навозная, и муравейная
  • игра "...-мала"
  • мусорная возвышенность
  • навальный результат разгрузки самосвала
  • навозная или муравьиная
  • нагромождение
  • нагромождение мусора
  • нераспределенная компьютерная память
  • нераспределенная память
  • полная гора навоза
  • рукотворная груда
  • синоним груда
  • скопление материала
  • скопление сыпучего
  • скопление чего-либо сыпучего
  • дворовая игра «... мала»
  • детская игра «...-мала»
  • игра «...-мала»
  • «подождет ваша... дел»
  • ... мала!
  • «холм» после разгрузки самосвала
  • груда всяческого барахла
  • 1 улица, ряд домов, дорога, проход (тадж.)
  • 2 холм в Свердловской обл.; густые кучевые облака летом в Архангельской обл.
  • синоним - груда
  • Ворох.
  • Груда мусора.
  • Нераспределенная компьютерная память.
  • Груда.
  • Глобальная единица счета навоза.
  • Груда, которая мала.
  • Дворовая игра «... мала».
  • Скопление чего-либо сыпучего.
  • В информатике и программировании регион зарезервированного адресного пространства, условное название структуры данных, поверх которой реализована динамическая память приложения.
  • дворовая игра «КУЧА мала»
  • «подождет ваша КУЧА дел»
  • КУЧА мала!
  • детская игра «КУЧА -мала»
  • игра «КУЧА -мала»
  • Синонимы к слову куча

      • груда
      • масса
      • скопище
      • толпа

    Гиперонимы к слову куча

    Однокоренные слова для куча

    • прилагательные

      • кучный

      умласк

      • кучка

    Фразеологизмы для слова куча

      • куча мала

    Память, которую используют программы, состоит из нескольких частей — сегментов :

    Сегмент кода (или ещё «текстовый сегмент»), где находится скомпилированная программа. Обычно доступен только для чтения.

    Сегмент bss (или ещё «неинициализированный сегмент данных»), где хранятся глобальные и , инициализированные нулём.

    Сегмент данных (или ещё «сегмент инициализированных данных»), где хранятся инициализированные глобальные и статические переменные.

    К уча , откуда выделяются динамические переменные.

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

    В этом уроке мы рассмотрим только кучу и стек, поскольку всё самое интересное происходит именно здесь.

    Куча

    Сегмент кучи (или просто «куча ») отслеживает память, используемую для динамического выделения. Мы уже немного поговорили о куче в .

    В C++, при использовании оператора new для выделения динамической памяти, эта память выделяется в сегменте кучи самой программы:

    int *ptr = new int; // для ptr выделяется 4 байта из кучи int *array = new int; // для array выделяется 40 байт из кучи

    Адрес выделяемой памяти передаётся обратно оператором new и затем он может быть сохранён в . О механизме хранения и выделения свободной памяти нам сейчас беспокоиться незачем. Однако стоит знать, что последовательные запросы памяти не всегда приводят к выделению последовательных адресов памяти!

    int *ptr1 = new int; int *ptr2 = new int; // ptr1 и ptr2 могут не иметь последовательных адресов

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

    Куча имеет свои преимущества и недостатки:

    Выделение памяти в куче сравнительно медленное.

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

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

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

    Стек вызовов

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

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

    Стек как структура данных

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

    Например, рассмотрим стопку (аналогия - стек) тарелок на столе. Поскольку каждая тарелка тяжёлая, а они ещё сложены друг на друге, то вы сможете сделать что-то одно из следующего:

    Посмотреть на поверхность первой тарелки (которая находится на самом верху).

    Взять верхнюю тарелку из стопки (обнажая таким образом следующую тарелку, которая находится под ней - если она вообще есть).

    Положить новую тарелку поверх стопки (спрятав под ней самую верхнюю тарелку — если она вообще была).

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

    Посмотреть на верхний элемент стека (используя функцию top () или peek () ).

    Вытянуть верхний элемент стека (используя функцию pop () ).

    Добавить новый элемент поверх стека (используя функцию push () ).

    Стек - это структура данных типа LIFO (англ. «L ast I n, F irst O ut» - «Последним пришёл, первым ушёл»). Последний элемент, который будет находиться на вершине стека, первым и уйдёт из него. Если положить новую тарелку поверх других тарелок, то именно эту тарелку вы первой и возьмёте. По мере того, как элементы помещаются в стек - стек растёт, по мере того, как элементы удаляются со стека - стек уменьшается.

    Например, рассмотрим коротенькую последовательность, показывающую, как работает добавление и удаление в стеке:

    Stack: empty
    Push 1
    Stack: 1
    Push 2
    Stack: 1 2
    Push 3
    Stack: 1 2 3
    Push 4
    Stack: 1 2 3 4
    Pop
    Stack: 1 2 3
    Pop
    Stack: 1 2
    Pop
    Stack: 1

    Стопка тарелок довольно-таки хорошая аналогия работы стека, но есть аналогия и получше. Например, рассмотрим несколько почтовых ящиков, которые расположены друг на друге. Каждый почтовый ящик может содержать только один элемент, и все почтовые ящики изначально пустые. Кроме того, каждый почтовый ящик прибивается гвоздём к почтовому ящику снизу, поэтому количество почтовых ящиков не может быть изменено. Если мы не можем изменить количество почтовых ящиков, то как мы получим поведение, подобное стеку?

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

    Сегмент стека вызовов

    Сегмент стека вызовов содержит память, используемую для стека вызовов. При запуске программы, функция main() помещается в стек вызовов операционной системой. Затем программа начинает своё выполнение.

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

    Наша аналогия с почтовыми ящиками - это действительно то, как работает стек вызовов. Стек вызовов имеет фиксированное количество адресов памяти (фиксированный размер). Почтовые ящики являются адресами памяти, а «элементы», которые мы добавляем и вытягиваем из стека, называются фреймами (или еще «кадрами ») стека. Кадр стека отслеживает все данные, связанные с одним вызовом функции. «Наклейка» — это регистр (небольшая часть памяти в ЦП), который является указателем стека. Указатель стека отслеживает вершину стека вызовов.

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

    Стек вызовов на практике

    Давайте рассмотрим более подробно, как работает стек вызовов. Ниже приведена последовательность шагов, выполняемых при вызове функции :

    Программа сталкивается с вызовом функции.

    Фрейм стека создаётся и помещается в стек. Он состоит из:

    Адреса инструкции, который находится за вызовом функции (так называемый «обратный адрес »). Так процессор запоминает, куда возвращаться после выполнения функции.

    Аргументов функции.

    Памяти для локальных переменных.

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

    Процессор переходит к точке начала выполнения функции.

    Инструкции внутри функции начинают выполняться.

    После завершения функции, выполняются следующие шаги :

    Регистры восстанавливаются из стека вызовов.

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

    Обрабатывается возвращаемое значение.

    ЦП возобновляет выполнение кода (исходя из обратного адреса).

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

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

    Пример стека вызовов

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

    Стек вызовов этой программы выглядит следующим образом:

    boo() (включая параметр b)
    main()

    Переполнение стека

    Стек имеет ограниченный размер и, следовательно, может содержать только ограниченный объём информации. В Windows размер стека по умолчанию составляет 1 МБ. На некоторых других Unix-системах этот размер может достигать и 8 МБ. Если программа пытается поместить в стек слишком много информации, то это приведёт к переполнению стека. Переполнение стека (англ. «stack overflow» ) происходит, когда запрашиваемой памяти нет в наличии (вся память уже занята).

    Переполнение стека является результатом добавления слишком большого количества переменных в стек и/или создания слишком большого количества вложенных вызовов функций (например, где функция A вызывает функцию B, которая, в свою очередь, вызывает функцию C, а та вызывает функцию D и т.д.). Переполнение стека обычно приводит к сбою в программе. Например:

    int main() { int stack; return 0; }

    int main ()

    int stack [ 1000000000 ] ;

    return 0 ;

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

    Вот ещё одна программа, которая вызовет переполнение стека, но уже по другой причине:

    void boo() { boo(); } int main() { boo(); return 0; }

    Синонимы:

    Ворох, громада, груда, горка, кипа, купа, сугроб; скирд, стог, омет.

    Тела лежали грудами. В этом селе избы стоят гнездами. Деревья стоят купами. Стог (скирд) сена. Кладь (одонье, одонья, зарод) хлеба. Омет соломы..

    Ср. . См. возвышенность, ворох, много

    высыпать кучу новостей, собрать в кучу... ..

    Словарь русских синонимов 4

    куча

    Синонимы:

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

    КУЧА значение

    Т.Ф. Ефремова Новый словарь русского языка. Толково- словообразовательный

    куча

    Значение:

    ку ́ча

    ж.

    а) Что-л., сваленное горкой, грудой.

    б) разг. Большое количество, скопление чего-л.

    2) разг. Толпа, скопление (людей, животных).

    3) разг. Большое количество, множество.

    С.И. Ожегов, Н.Ю. Шведова Толковый словарь русского языка

    куча

    Значение:

    КУ́ЧА, -и, ж.

    1. Скопление чего-н. сыпучего. К. песку. Сгрести сухие листья в кучу.

    2. чего. Нагромождение чего-н., множество кого-чего-н. К. книг. К. дел. К. денег (очень много). Толпа валит кучей.

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

    | уменьш. кучка , -и, ж. (к 1 знач. ).

    Малый академический словарь русского языка

    куча

    Значение:

    И, ж.

    Большое количество чего-л., обычно сыпучего, мелкого, наваленное, насыпанное в одном месте.

    Куча песку. Куча камней.

    У хижин, на рогожках, кучами лежали овощи и сушились на солнце.

    Большое количество каких-л. предметов, нагроможденных в беспорядке один на другой; груда.

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

    2. Разг.

    Беспорядочное скопление людей, животных.

    На берегу теснилась куча негров и негритянок. И. Гончаров, Фрегат «Паллада».

    От Вязьмы французские войска, прежде шедшие тремя колоннами, шли теперь одною кучей. Л. Толстой, Война и мир.

    {Овцы} неподвижно стоят, сбившись в кучу, спасаясь от жары и оводов. Серафимович, Лихорадка.

    кого-чего. Разг. Большое количество; множество.

    Покупателей этих произведений {лубочных картин} обыкновенно немного, но зато зрителей - куча. Гоголь, Портрет.

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

    - У меня куча дел накопилась в управлении, - сказал он весело. Крымов, Танкер «Дербент».

    Двоичная куча (binary heap) – просто реализуемая структура данных, позволяющая быстро (за логарифмическое время) добавлять элементы и извлекать элемент с максимальным приоритетом (например, максимальный по значению).

    Для дальнейшего чтения необходимо иметь представление о деревьях , а также желательно знать об оценке сложности алгоритмов . Алгоритмы в этой статье будут сопровождаться кодом на C#.

    Введение

    Двоичная куча представляет собой полное бинарное дерево, для которого выполняется основное свойство кучи : приоритет каждой вершины больше приоритетов её потомков. В простейшем случае приоритет каждой вершины можно считать равным её значению. В таком случае структура называется max-heap , поскольку корень поддерева является максимумом из значений элементов поддерева. В этой статье для простоты используется именно такое представление. Напомню также, что дерево называется полным бинарным , если у каждой вершины есть не более двух потомков, а заполнение уровней вершин идет сверху вниз (в пределах одного уровня – слева направо).

    Двоичную кучу удобно хранить в виде одномерного массива, причем левый потомок вершины с индексом i имеет индекс 2*i+1 , а правый 2*i+2 . Корень дерева – элемент с индексом 0. Высота двоичной кучи равна высоте дерева, то есть log 2 N, где N – количество элементов массива.

    Приведу заготовку класса на C#:

    Public class BinaryHeap { private List list; public int heapSize { get { return this.list.Count(); } } }

    Добавление элемента

    Новый элемент добавляется на последнее место в массиве, то есть позицию с индексом heapSize :

    Возможно, что при этом будет нарушено основное свойство кучи, так как новый элемент может быть больше родителя. В таком случае следует «поднимать» новый элемент на один уровень (менять с вершиной-родителем) до тех пор, пока не будет соблюдено основное свойство кучи:

    Иначе говоря, новый элемент «всплывает», «проталкивается» вверх, пока не займет свое место. Сложность алгоритма не превышает высоты двоичной кучи (так как количество «подъемов» не больше высоты дерева), то есть равна O(log 2 N).

    Public void add(int value) { list.Add(value); int i = heapSize - 1; int parent = (i - 1) / 2; while (i > 0 && list < list[i]) { int temp = list[i]; list[i] = list; list = temp; i = parent; parent = (i - 1) / 2; } }

    Упорядочение двоичной кучи

    В ходе других операций с уже построенной двоичной кучей также может нарушиться основное свойство кучи: вершина может стать меньше своего потомка.

    Метод heapify восстанавливает основное свойство кучи для дерева с корнем в i-ой вершине при условии, что оба поддерева ему удовлетворяют. Для этого необходимо «опускать» i-ую вершину (менять местами с наибольшим из потомков), пока основное свойство не будет восстановлено (процесс завершится, когда не найдется потомка, большего своего родителя). Нетрудно понять, что сложность этого алгоритма также равна O(log 2 N).

    Public void heapify(int i) { int leftChild; int rightChild; int largestChild; for (; ;) { leftChild = 2 * i + 1; rightChild = 2 * i + 2; largestChild = i; if (leftChild < heapSize && list > list) { largestChild = leftChild; } if (rightChild < heapSize && list > list) { largestChild = rightChild; } if (largestChild == i) { break; } int temp = list[i]; list[i] = list; list = temp; i = largestChild; } }

    Построение двоичной кучи

    Наиболее очевидный способ построить кучу из неупорядоченного массива – это по очереди добавить все его элементы. Временная оценка такого алгоритма O(N log 2 N). Однако можно построить кучу еще быстрее - за О(N). Сначала следует построить дерево из всех элементов массива, не заботясь о соблюдении основного свойства кучи, а потом вызвать метод heapify для всех вершин, у которых есть хотя бы один потомок (так как поддеревья, состоящие из одной вершины без потомков, уже упорядочены). Потомки гарантированно есть у первых heapSize/2 вершин.

    Public void buildHeap(int sourceArray) { list = sourceArray.ToList(); for (int i = heapSize / 2; i >= 0; i--) { heapify(i); } }

    Извлечение (удаление) максимального элемента

    В упорядоченном max-heap максимальный элемент всегда хранится в корне. Восстановить упорядоченность двоичной кучи после удаления максимального элемента можно, поставив на его место последний элемент и вызвав heapify для корня, то есть упорядочив все дерево.

    Public int getMax() { int result = list; list = list; list.RemoveAt(heapSize - 1); return result; }

    Сортировка с применением двоичной кучи

    Заметим, что можно отсортировать массив, сначала построив из него двоичную кучу, а потом последовательно извлекая максимальные элементы. Оценим временную сложность такого элемента: построение кучи – O(N), извлечение N элементов – O(N log 2 N). Следовательно, итоговая оценка O(N log 2 N). При этом дополнительная память для массива не используется.

    Public void heapSort(int array) { buildHeap(array); for (int i = array.Length - 1; i >= 0; i--) { array[i] = getMax(); heapify(0); } }

    Заключение

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

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

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

    Структура памяти

    структура любой компилируемой программы такова, что состоит из=

    1. стека
    2. и остальной памяти, называемой кучей.

    Стек

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

    Однако в C++, равно как и в других компилируемых языках, существуют громоздкие типы данных типа =

    • массивов,
    • структур
    • и классов.

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



    Статьи по теме