Почему выделение памяти на "куче" НАМНОГО медленнее, чем на стеке?

Мне много раз говорили это. Но я не знаю ПОЧЕМУ... Какие дополнительные расходы включены при выделении памяти от "кучи"? Действительно ли это связано с аппаратными средствами? Это связано с циклами ЦП? Столько предположений, но никакие точные ответы... Кто-то мог дать мне некоторую разработку?

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

44
задан b4hand 6 May 2015 в 16:28
поделиться

2 ответа

Потому что куча - это гораздо более сложная структура данных, чем стек.

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

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

51
ответ дан 26 November 2019 в 22:02
поделиться

Основное различие между стеком и кучей состоит в том, что элементы на стек не может быть удален из строя. Если вы добавляете элементы A, B, C в стек, вы не можете удалить B, не удалив сначала C. Это означает, что добавление нового элемента в стек всегда означает добавление его на конец стека, что является очень простой операцией. Вы просто перемещаете указатель, указывающий на конец стека.

В куче, с другой стороны, вы можете удалять элементы не по порядку. И до тех пор, пока вы впоследствии не перемещаете другие элементы в памяти (как это делают некоторые кучи со сборщиком мусора), ваша куча будет иметь «дыру» посередине. Т.е. если вы добавите A, B, C в кучу и удалите B, ваша куча будет выглядеть в памяти следующим образом: A _ C, где _ - это блок неиспользуемой (свободной) памяти. Если вы добавите новый элемент D сейчас, распределитель должен найти непрерывное свободное пространство, достаточно большое, чтобы вместить D. В зависимости от того, сколько непрерывных свободных пространств имеется в вашей памяти, это может быть дорогостоящей операцией. И это почти всегда дороже, чем просто перемещение указателя «последнего элемента» стека.

13
ответ дан 26 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: