-1

Это, наверное, довольно простой вопрос, но я думаю, что важно знать ответ. У меня очень длинный цикл, в котором я использую определенный указатель только в начале. Лучше ли выделять требуемую память за пределы цикла и освобождать ее, когда цикл закончен, или многократно выделять память в начале цикла и освобождать ее, как только я закончил с указателем? Я предполагаю, что последний случай лучше двух, но я действительно не знаю, сколько энергии приходится на выделение памяти каждый раз, поэтому я хотел проверить, прежде чем продолжить.Когда я должен освобождать память, используемую в цикле в C?

+3

Это зависит. О том, что делает ваш код. Только вы можете это увидеть. –

+1

Если вы можете легко повторно использовать буфер, то было бы лучше выполнить только одно выделение. Но да, нам нужен пример кода. –

ответ

0

Это зависит именно от того, где ваше узкое место производительности.

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

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

Обычно, когда вы пишете код C, оба утверждения являются истинными. Итак, это компромисс: вы должны проверить, что потеря менее дорогостоящая для вашей конкретной ситуации.

Надеюсь, что это поможет.

+1

Отлично, это именно то, что мне нужно было знать. Благодаря! – ping

0

Ответ правильный, и это на самом деле довольно сложная проблема.

Это зависит от многих вещей, размера выделения, фрагментация памяти, оптимизация, ...

Если у вас достаточно памяти, выделение и освобождение вне цикла (так как в отношении скорости, динамическое распределение плохо)

Если нет, выделите его, прежде чем вам понадобится память и освободите ее как можно скорее.

0

Если выделение строго используется локально для цикла, я бы начал с предположения, что распределение/освобождение должно происходить в цикле. Это похоже на идею о том, что переменные, используемые только внутри тела цикла, должны быть объявлены локальными для цикла.

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

  • performance - alloc/dealloc стоит дорого. Оттолкнуть от повторных операций alloc/dealloc является действительной причиной для перемещения их за пределы цикла. Для многих циклов это, вероятно, не имеет большого значения, но это определенно может быть серьезной проблемой.

  • правильность - если цикл может закончиться раньше, тогда лучше всего переместить освобождение за пределы, где было бы легче учесть все пути, по которым петля может выйти. Обратите внимание: в C++ поддержка RAII может поощрять противоположную стратегию.

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