當分配大對象(如路徑名,可能超過512字節)時,Symbian等一些系統堅持人們使用堆而不是堆棧。這有什麼特別的原因嗎?小內存設備中的內存分配
2
A
回答
1
大多數嵌入式設備都沒有內存管理單元,所以操作系統無法自動增加堆棧空間,這對程序員來說是透明的。即使假設一個可增長的堆棧,你將不得不自己管理它,這並不比堆分配好,並且首先破壞了使用堆棧的目的。
0
嵌入式設備的堆棧通常駐留在非常少量的高速內存中。如果您在此類設備上的堆棧上分配大型對象,則可能面臨堆棧溢出。
2
嵌入式設備通常具有固定大小的堆棧。由於C中的子程序調用僅需將幾個字壓入堆棧,因此只需幾百字節即可(如果避免遞歸函數調用)。
3
通常,嵌入式設備上的堆棧固定爲非常小,即8K是Symbian上的默認堆棧大小。
如果您考慮最大長度文件名爲256bytes,但是對於512字節的Unicode已經是您的整個堆棧的1/16(僅用於1個文件名)。所以你可以想象,如果你不小心使用堆棧很容易。
3
大多數Symbian設備都帶有MMU,但直到最近才支持分頁功能。這意味着每個正在運行的進程都會提交物理RAM。 Symbian上的每個線程都有(通常)固定的8KB堆棧。如果每個線程都有一個堆棧,那麼將這個堆棧的大小從8KB增加到32KB就會對設備的內存要求產生很大的影響。
堆是全局的。如果你需要這樣做,增加它的大小,影響就會小得多。所以,在Symbian上,堆棧僅用於小數據項 - 從堆中分配較大的數據項。
相關問題
- 1. Android小部件中的內存分配
- 2. 內存分配
- 3. 內存分配
- 4. 內存分配
- 5. 內存分配
- 6. 內存分配
- 7. 內存分配
- 8. 內存分配
- 9. 分配內存
- 10. 內存分配
- 11. 內存分配
- 12. 內存分配
- 13. 內存分配
- 14. 內存分配
- 15. 內部存儲Android - 設備內存
- 16. 在CUDA設備中的內存分配不是預期的
- 17. Android設備中的內存和存儲
- 18. 在cuda中使用靜態分配內存時的全局設備內存大小限制
- 19. gpuocelot是否支持CUDA設備中的動態內存分配?
- 20. 分配給SQLite內存數據庫的內存大小
- 21. C中的內存分配
- 22. ruby中的內存分配
- 23. C++中的內存分配
- 24. OpenGL中的內存分配
- 25. 類中的內存分配
- 26. VisualStudio中的內存分配!
- 27. Lisp中的內存分配
- 28. C++中的內存分配
- 29. 在C++中用void *分配內存結構內存分配
- 30. cudaMallocHost無法分配最小的內存
你的意思是說棧一般分配在緩存中? – chappar 2008-12-12 17:14:43