Суммируя
Стек используется для распределения статической памяти, а куча - для распределения динамической памяти, которые хранятся в оперативной памяти компьютера.
В деталях
Стек
Стек представляет собой структуру данных «LIFO» (последний пришел - первым ушел), которая довольно тщательно управляется и оптимизируется процессором. Каждый раз, когда функция объявляет новую переменную, она «помещается» в стек. Затем каждый раз, когда функция завершается, все переменные, помещенные в стек этой функцией, освобождаются (то есть они удаляются). После освобождения переменной стека эта область памяти становится доступной для других переменных стека.
Преимущество использования стека для хранения переменных заключается в том, что память управляется за вас. Вам не нужно выделять память вручную или освобождать ее, если она вам больше не нужна. Более того, поскольку ЦП так эффективно организует стековую память, чтение и запись переменных стека происходит очень быстро.
Дополнительную информацию можно найти здесь.
Куча
Куча - это область памяти вашего компьютера, которая не управляется автоматически и не так жестко управляется ЦП. Это более свободно плавающая область памяти (и больше). Чтобы выделить память в куче, вы должны использовать malloc () или calloc (), которые являются встроенными функциями C. После того, как вы выделили память в куче, вы несете ответственность за использование free () для освобождения этой памяти, если она вам больше не нужна.
Если вы этого не сделаете, ваша программа будет иметь так называемую утечку памяти. То есть память в куче по-прежнему будет выделена (и не будет доступна другим процессам). Как мы увидим в разделе отладки, существует инструмент под названием Valgrind, который может помочь вам обнаружить память утечки.
В отличие от стека, куча не имеет ограничений размера на переменный размер (кроме очевидных физических ограничений вашего компьютера). Память кучи немного медленнее для чтения и записи, потому что для доступа к памяти в куче необходимо использовать указатели. Вскоре мы поговорим об указателях.
В отличие от стека, переменные, созданные в куче, доступны любой функции в любом месте вашей программы. Переменные кучи по сути глобальны по своему охвату.
Дополнительную информацию можно найти здесь.
Переменные, размещенные в стеке, хранятся непосредственно в памяти, и доступ к этой памяти осуществляется очень быстро, а ее выделение обрабатывается при компиляции программы. Когда функция или метод вызывает другую функцию, которая по очереди вызывает другую функцию и т. Д., Выполнение всех этих функций остается приостановленным до тех пор, пока самая последняя функция не вернет свое значение. Стек всегда резервируется в порядке LIFO, последний зарезервированный блок всегда является следующим блоком, который должен быть освобожден. Это упрощает отслеживание стека, освобождение блока из стека - это не что иное, как корректировка одного указателя.
Переменные, выделенные в куче, имеют свою память, выделенную во время выполнения, и доступ к этой памяти немного медленнее, но размер кучи ограничен только размером виртуальной памяти. Элементы кучи не зависят друг от друга и всегда могут быть доступны случайным образом в любое время. Вы можете выделить блок в любое время и освободить его в любое время. Это значительно усложняет отслеживание того, какие части кучи выделены или освобождены в любой момент времени.
Вы можете использовать стек, если точно знаете, сколько данных вам нужно выделить до времени компиляции, и он не слишком велик. Вы можете использовать кучу, если не знаете точно, сколько данных вам понадобится во время выполнения, или если вам нужно выделить много данных.
В многопоточной ситуации каждый поток будет иметь свой собственный полностью независимый стек, но они будут совместно использовать кучу. Стек зависит от потока, а куча зависит от приложения. Стек важно учитывать при обработке исключений и выполнении потоков.
Каждый поток получает стек, в то время как обычно существует только одна куча для приложения (хотя нередко бывает несколько куч для разных типов распределения).
Во время выполнения, если приложению требуется больше кучи, оно может выделить память из свободной памяти, а если стеку требуется память, оно может выделить память из свободной памяти, выделенной для приложения.
Более подробная информация представлена здесь и здесь.
Теперь перейдите к ответам на ваш вопрос.
В какой степени они контролируются ОС или языковой средой?
ОС выделяет стек для каждого потока системного уровня при создании потока. Обычно ОС вызывается средой выполнения языка для выделения кучи для приложения.
Дополнительную информацию можно найти здесь .
Каковы их возможности?
Уже занесено в топ.
«Вы можете использовать стек, если точно знаете, сколько данных вам нужно выделить до времени компиляции, и он не слишком большой. Вы можете использовать кучу, если не знаете точно, сколько данных вам понадобится во время выполнения или если вам нужно выделить много данных ".
Дополнительную информацию можно найти здесь.
От чего зависит размер каждого из них?
Размер стека устанавливается ОС при создании потока. Размер кучи устанавливается при запуске приложения, но он может увеличиваться по мере необходимости в пространстве (распределитель запрашивает у операционной системы больше памяти).
Что делает человека быстрее?
Распределение стека происходит намного быстрее, поскольку все, что он действительно делает, это перемещает указатель стека. Используя пулы памяти, вы можете получить сопоставимую производительность из распределения кучи, но это связано с небольшой дополнительной сложностью и собственными головными болями.
Кроме того, соотношение стека и кучи - это не только соображения производительности; он также многое говорит об ожидаемом времени жизни объектов.
Подробности можно найти здесь strong >.
person
Abrar Jahin
schedule
02.05.2016
rlimit_stack
. См. Также проблему 1463241 Red Hat. - person jww   schedule 21.06.2017