2010-03-14 5 views
8

Плохой ли стиль для разработки ваших простых программ на C для размещения всего или всего всего в стеке?Распределение стека в C

+3

Это зависит от того, что означает «все». – AraK

+1

Если вы собираетесь делать все с местными жителями и параметрами, почему вы используете C в первую очередь? Вместо этого используйте функциональный язык, такой как ML, Haskell, Erlang и т. Д. –

+0

В отличие от того, о чем вы думаете? Глобальные переменные или данные о куче? –

ответ

16

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

+2

Я бы больше, чем +1, если мог. Распределение стека безопасно, предотвращает утечку памяти и устраняет проблемы с указателем нулевого или мусора. Используйте его, когда это возможно. – kyoryu

+1

+1 - Абсолютно - куча представляет собой более сложную структуру данных, чем стек, а не только лишние накладные расходы во многих случаях, но и причину ненужной сложности с такими потенциальными проблемами, как оборванные указатели, утечка памяти, повреждение кучи и т. Д. Нет причин избегать кучи, когда это необходимо, но, конечно, это опция «когда это необходимо», а не разумный вариант по умолчанию. – Steve314

+0

И нет кучи в C. –

1

Если мы делаем упор на программы SIMPLE, как вы сказали, то нет, это не так уж плохо :) Вы также можете взглянуть на массивы переменной длины C99 (вот простой пример: http://en.wikipedia.org/wiki/Variable-length_array).

+0

+1 Для упоминания VLA. Я использовал их в небольшом проекте, и они помогали избегать распределения кучи большую часть времени. – helpermethod

0

Нет. Если у вас нет переменных с нефиксированным размером. Такой код может довольно быстро переходить на переполнение стека.

3

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

Основными причинами, не используя стек являются:

  • Размер требуется не известно до времени выполнения.
  • Необходимо много памяти (мегабайт); что может вызвать проблемы в системах, где размеры стека обычно ограничены двузначными числами мегабайт.
+2

Или если требуется большая память (Kilobytes); что может вызвать проблемы в системах, где размеры стека обычно ограничены двузначными числами Kilobytes (например, драйверами устройств на ПК или любой программой в большинстве встроенных систем). – Dipstick

1

Главное преимущество кучи заключается в том, что вы можете динамически выделять на нее. Если вы не знаете размер переменной, который вам нужен: куча его.

Если ваша программа проста, вам может не понадобиться выделять переменную в кучу; но выбор не зависит от сложности программы, это зависит от необходимости вашей переменной. Если вам нужно получить доступ/изменить переменную по всему вашему документообороту, используя несколько функций, то это лучше в куче. Вы освободите его, когда вам это больше не понадобится. Если переменная является только структурой опций или счетчиком, стек идеально подходит для нее.

Смежные вопросы