Почему мы не должны динамически распределять память по стеку в C? - PullRequest
1 голос
/ 18 июля 2011

У нас есть функции для распределения памяти в стеке как в системах Windows, так и в системах Linux, но их использование не рекомендуется, и они не являются частью стандарта C? Это означает, что они обеспечивают нестандартное поведение. Поскольку я не настолько опытен, я не могу понять, в чем может быть проблема при выделении памяти из стека, а не при использовании кучи?

Спасибо.

РЕДАКТИРОВАТЬ: Мое мнение: Как объяснил Делан, объем стека, выделенного для программы, определяется во время компиляции , поэтому мы не можем запросить больше стека у ОС, если у нас кончатся. Единственным выходом будет сбой. Поэтому лучше оставить стек для хранения основных вещей, таких как переменные, функции, вызовы функций, массивы, структуры и т. д., и использовать кучу столько же, сколько и емкость ОС / машины.

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

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

Однако проблема с этим, по крайней мере в конкретном случае alloca(3), заключается в том, чтово многих реализациях он просто уменьшает указатель стека, не принимая во внимание или не уведомляя о том, действительно ли осталось какое-либо пространство стека.

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


Добавление: это не означает, что мы не должны использовать динамическое выделение стековой памяти;если вы

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

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

0 голосов
/ 18 июля 2011

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

Быстрая: потому что он выделяется во время компиляции, поэтому никаких накладных расходов не требуется

safe : это исключительная безопасность.Стек генерируется автоматически при возникновении исключения.

полное доказательство : вам не нужно беспокоиться о сценариях типа virtual деструкторов.Деструкторы вызываются в правильном порядке.

Тем не менее, иногда есть необходимость выделить время выполнения памяти, тогда вы можете сначала прибегнуть к стандартным контейнерам, таким как vector, map, list и т. Д.Выделение памяти указателям на строки всегда должно быть разумным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...