這可能是一個非常基本的問題,但我認爲重要的是我知道答案。我有一個非常長的循環,我只在開始時使用某個指針。在循環結束之外分配所需的內存並在循環結束時釋放它,或者在循環開始時重複分配內存並在完成指針後釋放它會更好嗎?我認爲後者是兩者中較好的一個,但我不知道每次分配內存的能力有多大,所以我想在繼續之前進行檢查。什麼時候應該釋放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. 什麼時候應該使用Map而不是For循環?
- 7. 什麼時候應該使用PostgreSQL中
- 8. 在C中釋放內存時應該考慮的主要事情是什麼?
- 9. 在C#中,什麼時候應該使用一個結構,什麼時候應該使用一個類?
- 10. 什麼時候應該使用AWS,什麼時候不使用
- 11. 什麼時候應該使用Import-Package,什麼時候應該使用Require-Bundle?
- 12. 什麼時候釋放GObject?
- 13. 什麼時候應該在過渡到新的時候釋放當前的UIViewController?
- 14. 什麼時候應該是我的循環的條件
- 15. 什麼時候應該out和ref參數在C#中使用?
- 16. 什麼時候應該在C#中使用屬性?
- 17. 我們應該什麼時候在C#中使用事件
- 18. 什麼時候應該在objective-c中使用nil?
- 19. 什麼時候應該在C++/CX中使用ref類?
- 20. C++ - 什麼時候應該在類中使用指針成員
- 21. JNI什麼時候決定可以釋放內存?
- 22. 什麼時候應該使用datagrid,何時應該使用datagridview?
- 23. 什麼時候應該使用$(object),何時應該使用$ object?
- 24. 分配/釋放內存內循環
- 25. 時候和爲什麼我應該使用NamedNativeQuery或NamedQuery註釋
- 26. 什麼時候應該使用getElementById?
- 27. 什麼時候應該使用_aligned_malloc()?
- 28. 什麼時候應該使用GC.SuppressFinalize()?
- 29. 什麼時候應該使用`use`?
- 30. 什麼時候應該使用didFinishLaunchingWithOptions?
這取決於。關於你的代碼在做什麼。只有你可以看到它。 – 2014-10-03 20:41:26
如果您可以輕鬆地重新使用緩衝區,則僅執行一次分配會更好。但是,我們需要一個代碼示例。 – 2014-10-03 20:42:11