-1

這可能是一個非常基本的問題,但我認爲重要的是我知道答案。我有一個非常長的循環,我只在開始時使用某個指針。在循環結束之外分配所需的內存並在循環結束時釋放它,或者在循環開始時重複分配內存並在完成指針後釋放它會更好嗎?我認爲後者是兩者中較好的一個,但我不知道每次分配內存的能力有多大,所以我想在繼續之前進行檢查。什麼時候應該釋放C中循環中使用的內存?

+3

這取決於。關於你的代碼在做什麼。只有你可以看到它。 – 2014-10-03 20:41:26

+1

如果您可以輕鬆地重新使用緩衝區,則僅執行一次分配會更好。但是,我們需要一個代碼示例。 – 2014-10-03 20:42:11

回答

0

這完全取決於您的性能瓶頸在哪裏。

如果你需要它儘可能快,並且每一毫秒都很重要,那麼你最好的辦法就是不要每次都分配它。

但是,它花費內存。如果內存對您來說是一個巨大的問題,並且每個分配的字節都很痛苦,那麼您應該儘快釋放內存,並在需要時準確分配內存,如果需要的話可以多次分配內存。

通常,當你編寫C代碼時,兩個語句都是真實的。所以,這是一種折衷:你必須檢查損失對於你的特殊情況來說成本較低。

希望有所幫助。

+1

太好了,那正是我需要知道的。謝謝! – ping 2014-10-03 20:48:34

0

沒有正確的答案,這實際上是一個相當複雜的問題。

這取決於很多因素,分配大小,內存碎片,優化,...

如果你有足夠的內存,分配和釋放的循環外(因爲關於速度,動態分配是壞的)

如果沒有,請在需要記憶之前進行分配,然後儘快釋放。

0

如果分配只是嚴格用於循環的本地,那麼我將從分配/釋放應該在循環內發生的假設開始。這是一個類似的概念,即只有在循環體內使用的變量才應該在循環中聲明爲局部變量。

但是,這只是一個起點。有幾個有效的理由讓循環外的分配和循環完成時釋放。其中一些原因可能是:

  • 性能 - alloc/dealloc很貴。來自重複的alloc/dealloc操作的轉移是將這些移動到循環外的有效理由。對於許多循環來說,這可能無關緊要,但它肯定可能是一個有效的關注點。

  • 正確性 - 如果循環可能會提前終止,那麼最好將釋放移到外部,這可能更容易計算循環可以退出的所有方式。請注意,在C++中,RAII支持可能會鼓勵相反的策略。

相關問題