C лучшие практики, стек против распределения кучи - PullRequest
3 голосов
/ 29 января 2011

Я использую c совсем недавно и обнаружил, что мне действительно не нравится иметь дело с управлением памятью или, по крайней мере, с мыслью, что, если я назначу указатель неправильно, я должен его освободить, даже если это самая тривиальная вещь. Это привело меня к тому, чтобы разместить как можно больше в стеке и использовать & для определения его местоположения. Даже создание отдельных переменных int и inptr (у меня была некоторая проблема с lvalue в операторе & в макросах).

Я не нашел много мест, где мне приходилось сталкиваться с передачей данных (выше / ниже), где они были распределены. В то же время мне нужно приличное количество ранних возвратов (и я бы предпочел избегать gotos). Каково общее мнение c сказать? Есть ли какие-либо очевидные признаки того, что я должен использовать тот или иной в конкретном случае.

P.S. Одна вещь, которая заставила меня немного волноваться, это то, что у меня недавно возникла проблема с повреждением памяти из-за использования неправильного sizeof для malloc, и я не заметил этого сразу, поскольку большинство моих путей кода непосредственно после этой точки не использовали кучу , Как вы думаете, насколько велика проблема такого рода сокрытия коррупции?

Ответы [ 4 ]

7 голосов
/ 29 января 2011

Вы должны использовать malloc, если:

  1. Вы передаете указатели на не-static const данные в стек вызовов, или
  2. , вы выделяете переменную илипросто большие объемы данных (иначе вы рискуете переполнением стека).

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

3 голосов
/ 29 января 2011

Немного языком щека: самый верный признак - когда вы выбываете из стека.

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

2 голосов
/ 29 января 2011

Хотя технически это не имеет прямого отношения к вопросу ОП, оно находится в том же баллистическом парке (что, я полагаю, является достаточным основанием для моего ответа).

Возможно, вы захотите взглянуть на " Boehm C Сборщик мусора ". Это проверенное временем программное обеспечение, и я использовал его много раз без каких-либо проблем. Это позволяет эффективно использовать malloc для всего и просто забыть о соответствующем free.

0 голосов
/ 29 января 2011

Распределение стека полезно, когда вам приходится иметь дело с небольшим количеством данных, и эти данные нужны только в одной функции.Если вместо этого вам нужно передавать указатели между функциями, лучше использовать malloc () в памяти в куче, поскольку после выхода из функции ее стек может быть перезаписан в любой момент.Наличие более 127 байтов локальных данных замедлит выполнение, поскольку, если смещение находится в пределах этого предела, оно может быть включено в саму инструкцию (например, mov eax, [ebp - 4]), поэтому символьные буферы следует размещать в куче (если вы не 'уверен, что они не превысят этот предел).Еще одна вещь, связанная с free () (по стоимости, за которую проголосуют;): освобождение вашей памяти не требуется, если на самом деле ОС потребует обратно всю память, которую она дала вашему приложению, но это плохая практика программирования, признак лени ивызвать утечки памяти или любые другие ошибки.

...