Это, наверное, довольно простой вопрос, но я думаю, что важно знать ответ. У меня очень длинный цикл, в котором я использую определенный указатель только в начале. Лучше ли выделять требуемую память за пределы цикла и освобождать ее, когда цикл закончен, или многократно выделять память в начале цикла и освобождать ее, как только я закончил с указателем? Я предполагаю, что последний случай лучше двух, но я действительно не знаю, сколько энергии приходится на выделение памяти каждый раз, поэтому я хотел проверить, прежде чем продолжить.Когда я должен освобождать память, используемую в цикле в C?
ответ
Это зависит именно от того, где ваше узкое место производительности.
Если вам нужно, чтобы это было так быстро, как вы можете, и каждый миллисекунда имеет значение, тогда ваш лучший снимок не будет выделять его каждый раз.
Однако, он проводит память. Если память является для вас огромной проблемой, и каждый выделенный один байт является болезненным, тогда вы должны освободить память ASAP - и, таким образом, выделяя ее именно тогда, когда вам нужно, несколько раз, если это необходимо.
Обычно, когда вы пишете код C, оба утверждения являются истинными. Итак, это компромисс: вы должны проверить, что потеря менее дорогостоящая для вашей конкретной ситуации.
Надеюсь, что это поможет.
Отлично, это именно то, что мне нужно было знать. Благодаря! – ping
Ответ правильный, и это на самом деле довольно сложная проблема.
Это зависит от многих вещей, размера выделения, фрагментация памяти, оптимизация, ...
Если у вас достаточно памяти, выделение и освобождение вне цикла (так как в отношении скорости, динамическое распределение плохо)
Если нет, выделите его, прежде чем вам понадобится память и освободите ее как можно скорее.
Если выделение строго используется локально для цикла, я бы начал с предположения, что распределение/освобождение должно происходить в цикле. Это похоже на идею о том, что переменные, используемые только внутри тела цикла, должны быть объявлены локальными для цикла.
Однако это только отправная точка. Существует несколько веских причин для выделения выделения за пределы цикла и освобождения от необходимости, когда цикл завершен. Некоторые из этих причин могут быть следующими:
performance - alloc/dealloc стоит дорого. Оттолкнуть от повторных операций alloc/dealloc является действительной причиной для перемещения их за пределы цикла. Для многих циклов это, вероятно, не имеет большого значения, но это определенно может быть серьезной проблемой.
правильность - если цикл может закончиться раньше, тогда лучше всего переместить освобождение за пределы, где было бы легче учесть все пути, по которым петля может выйти. Обратите внимание: в C++ поддержка RAII может поощрять противоположную стратегию.
- 1. Должен ли я освобождать память, используемую массивами в C#?
- 2. Когда мне следует освобождать память?
- 3. Как заставить мою std :: map освобождать используемую память?
- 4. Должен ли я освобождать память при использовании ARC?
- 5. C: Где я должен освобождать свои указатели?
- 6. Должен ли я явно освобождать память при использовании vlfeat?
- 7. Программно освобождать память в libstagrab
- 8. Должен ли я освобождать NSLocalizedString?
- 9. C++ освобождает всю память, используемую структурой
- 10. Когда я должен освобождать собственные (Android NDK) ручки?
- 11. c - unsetenv() реализация, нужно ли освобождать память?
- 12. Должен ли я освобождать или освобождать карту из функции?
- 13. Должен ли я освобождать память для короткой программы, если память не является проблемой?
- 14. Автоматически освобождать неиспользуемую память в ImageJ/Fiji
- 15. Python 3.x C API: Должен ли я освобождать память после извлечения строки из PyObject?
- 16. Как освободить память, используемую MediaElement
- 17. Как проверить память, используемую моим кодом C?
- 18. Должен ли я освобождать указатель на функцию?
- 19. Нужно ли явно освобождать память в управляемом C++?
- 20. Как измерить память, используемую в блоке или программе с C++
- 21. Должен ли я вручную освобождать свойства, объявленные как сохраняемые?
- 22. Могу ли я/должен ли я освобождать указатель, возвращаемый strtok
- 23. Должен ли я освобождать указатель, возвращаемый getpwuid() в Linux?
- 24. Очистить память, используемую страницей в WP8
- 25. Как обнаружить большую память, используемую в браузере
- 26. Как отслеживать используемую память в приложении Java?
- 27. Почему мне не нужно освобождать эту память?
- 28. Должен ли я освобождать выделение памяти C в проекте Xcode iOS?
- 29. Как найти память, используемую NSString?
- 30. Должен ли я освобождать переменные экземпляра и свойства в dealloc?
Это зависит. О том, что делает ваш код. Только вы можете это увидеть. –
Если вы можете легко повторно использовать буфер, то было бы лучше выполнить только одно выделение. Но да, нам нужен пример кода. –