这可能是一个非常基本的问题,但我认为重要的是我知道答案。我有一个非常长的循环,我只在开始时使用某个指针。在循环结束之外分配所需的内存并在循环结束时释放它,或者在循环开始时重复分配内存并在完成指针后释放它会更好吗?我认为后者是两者中较好的一个,但我不知道每次分配内存的能力有多大,所以我想在继续之前进行检查。什么时候应该释放C中循环中使用的内存?
回答
这完全取决于您的性能瓶颈在哪里。
如果你需要它尽可能快,并且每一毫秒都很重要,那么你最好的办法就是不要每次都分配它。
但是,它花费内存。如果内存对您来说是一个巨大的问题,并且每个分配的字节都很痛苦,那么您应该尽快释放内存,并在需要时准确分配内存,如果需要的话可以多次分配内存。
通常,当你编写C代码时,两个语句都是真实的。所以,这是一种折衷:你必须检查损失对于你的特殊情况来说成本较低。
希望有所帮助。
太好了,那正是我需要知道的。谢谢! – ping 2014-10-03 20:48:34
没有正确的答案,这实际上是一个相当复杂的问题。
这取决于很多因素,分配大小,内存碎片,优化,...
如果你有足够的内存,分配和释放的循环外(因为关于速度,动态分配是坏的)
如果没有,请在需要记忆之前进行分配,然后尽快释放。
如果分配只是严格用于循环的本地,那么我将从分配/释放应该在循环内发生的假设开始。这是一个类似的概念,即只有在循环体内使用的变量才应该在循环中声明为局部变量。
但是,这只是一个起点。有几个有效的理由让循环外的分配和循环完成时释放。其中一些原因可能是:
性能 - alloc/dealloc很贵。来自重复的alloc/dealloc操作的转移是将这些移动到循环外的有效理由。对于许多循环来说,这可能无关紧要,但它肯定可能是一个有效的关注点。
正确性 - 如果循环可能会提前终止,那么最好将释放移到外部,这可能更容易计算循环可以退出的所有方式。请注意,在C++中,RAII支持可能会鼓励相反的策略。
- 1. 什么时候应该释放内存?
- 2. 什么时候应该在objective-c中释放这些对象?
- 3. 什么时候需要释放内存?
- 4. 什么时候应该在IE中使用IEnumerator进行循环?
- 5. 什么时候从viewDidLoad中的循环释放NSMutableArray?
- 6. 什么时候应该释放异步使用的对象?
- 7. 什么时候从内存中释放定时器
- 8. 什么时候应该在dealloc中释放一个对象?
- 9. 什么时候应该使用Map而不是For循环?
- 10. 什么时候应该使用for循环提交SQLAlchemy?
- 11. 什么时候应该使用PostgreSQL中
- 12. 在C中释放内存时应该考虑的主要事情是什么?
- 13. 如何“释放”循环中的内存?
- 14. 在C#中,什么时候应该使用一个结构,什么时候应该使用一个类?
- 15. 什么时候应该使用AWS,什么时候不使用
- 16. 什么时候应该使用sed,什么时候应该使用awk
- 17. 什么时候应该使用memcpy,什么时候应该使用memmove?
- 18. 什么时候应该使用Import-Package,什么时候应该使用Require-Bundle?
- 19. 什么时候释放GObject?
- 20. 什么时候应该在过渡到新的时候释放当前的UIViewController?
- 21. 什么时候应该使用async/await,什么时候不用?
- 22. 什么时候应该是我的循环的条件
- 23. 什么时候纹理内存应该优于常量内存?
- 24. 我们应该什么时候在C#中使用事件
- 25. 什么时候应该out和ref参数在C#中使用?
- 26. C++ - 什么时候应该在类中使用指针成员
- 27. 什么时候应该在C#中使用属性?
- 28. 什么时候应该在C++/CX中使用ref类?
- 29. 什么时候应该在C++中使用字面类?
- 30. 什么时候应该在objective-c中使用nil?
这取决于。关于你的代码在做什么。只有你可以看到它。 – 2014-10-03 20:41:26
如果您可以轻松地重新使用缓冲区,则仅执行一次分配会更好。但是,我们需要一个代码示例。 – 2014-10-03 20:42:11