Re: [問題] stack v.s. heap sizes
我最近剛好又須要探討這個問題。
其實我一直對max stack size遠小於max heap size感到疑惑。
沒道理,automatic variables速度比dynamic variables快,
compiler要限制max stack size遠小於max heap size。
雖然之前Ebergies大有給個理由,但我一直覺得怪怪的,
在最後文章會有我的論點。
所以我又上google去找原因。
我發現真的有人說[1]"能用stack就用stack。不能用stack,才用heap。"
"In C++ use stack objects where you can, use heap objects when you have
to," said Peter van Merkerk.
"To summarize, use automatic storage whenever you can and dynamic
storage only when you must," said Tom.
但這並沒有解決我所有疑惑:為什麼max stack size那麼小?
max stack size那麼小,很容易就用光了。
後來我就去查Visual C++ max stack size是多少,但MSDN沒說多少,只說有上限[2]。
後來我只好自己去試。我發現我在Visual C++ 2010 Express的/stack設定
加了好多位數,都可以compile/link。
加到後來我驚覺一件事:Visucal C++早就可以叫很大的stack size。
後來我換成Visual C++ 2008 Express SP1,也是可以叫很大的stack size,
不是一般謠傳的16 MB[3]、32MB那麼小。
我的OS是Win 7 32-bit。
Visual C++ 2008的total automatic space上限是2GB,超過2GB會compile失敗。
我目前試出stack size可以到1.9G:
http://pic.pimg.tw/zxvc/c4855512304ed246d7142a8fe037d428.png?v=1283134381
http://pic.pimg.tw/zxvc/48f26a14e566dbd9f3d401b96e104879.png?v=1283134381
不過上圖一的那個"Memory (Priva..."其實只算physical memory的使用量,
要叫出phy+virtual memory,可以View/Select Columns.../Memory - Commit Size
※ 引述《zxvc (修行)》之銘言:
: 標題: [問題] stack v.s. heap sizes
: 時間: Sat Sep 12 20:14:48 2009
:
: 在Windows上stack最大可以設到32MB,
: heap卻可以設定到2GB。
:
: 請問為何這兩個限制大小差那麼多?
: 靜態變數(在stack)不是效能比較好嗎!?
: 為什麼需要配置大量空間不建議配置在stack?
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 140.115.221.79
: → suhorng:靜態變數!? 09/12 20:54
: → zxvc:應該說"靜態記憶體配置的變數"。 09/12 21:08
: 推 bobhsiao:stack是給local var用的, 通常幾十KB就夠了 09/12 22:12
: → bobhsiao:heap是給malloc/new用的, 使用量視AP而定 09/12 22:13
: 推 final01:heap可動態釋放!不過stack效能較好到是事實巴 09/12 23:06
: 推 Ebergies:這是邏輯上的思考, 通常 stack 是用來存取 function 內 09/12 23:15
: → Ebergies:的變數, 若 function 內的 local var 過大, 那麼這個 09/12 23:15
: → Ebergies:function 勢必不夠靈活, 光 recursive 沒幾次再大的 09/12 23:16
: → Ebergies:stack 也不夠用, 而這類超大空間的配置就使用上也大多 09/12 23:17
: → Ebergies:只需要配置很少的次數, 因此放在 heap 是合理且好的作法 09/12 23:17
不好意思,這樣有個假設,
就是所有漂亮的程式碼都不會是"遞迴且有很大的local variables"。
請問這能證出來嗎!?如果不能,這種coding style未必不好。
就算可能某些遞迴情形下,這些variables真的太大了,
難道"dynamic variables"就能解決這問題嗎?
如果max stack size可以跟max heap size一樣大(事實上stack真得可以很大),
heap的1MB會等於stack的1GB嗎?
既然不會,沒道理"遞迴且有很大的variables,用stack不夠,用heap會夠!?"
又stack不一定是要用在遞迴,
比如我想在main function用到一個很大的local variable。
所以我認為heap的好處不是在因為function不能遞迴很多次,
是在於它能動態產生、釋放記憶體。
: → zxvc:謝謝樓上。 09/14 20:16
References:
[1] http://www.velocityreviews.com/forums/t278261-stack-vs-heap.html
[2] http://msdn.microsoft.com/en-us/library/tdkhxaks(VS.71).aspx
[3] http://bluecat.csie.net/2009/10/28/3924/
--
信佛的人要知道:佛絕不會說謊。但請把握時光。
法滅盡經:
http://www.cbeta.org/result/normal/T12/0396_001.htm
共勉之。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.73.148
※ 編輯: zxvc 來自: 140.115.73.148 (08/30 12:39)
→
08/30 12:59, , 1F
08/30 12:59, 1F
→
08/30 12:59, , 2F
08/30 12:59, 2F
→
08/30 13:00, , 3F
08/30 13:00, 3F
→
08/30 13:02, , 4F
08/30 13:02, 4F
→
08/30 13:02, , 5F
08/30 13:02, 5F
→
08/30 13:02, , 6F
08/30 13:02, 6F
→
08/30 13:02, , 7F
08/30 13:02, 7F
→
08/30 13:03, , 8F
08/30 13:03, 8F
→
08/30 13:03, , 9F
08/30 13:03, 9F
→
08/30 13:04, , 10F
08/30 13:04, 10F
→
08/30 13:04, , 11F
08/30 13:04, 11F
→
08/30 13:04, , 12F
08/30 13:04, 12F
→
08/30 13:08, , 13F
08/30 13:08, 13F
→
08/30 13:09, , 14F
08/30 13:09, 14F
→
08/30 13:10, , 15F
08/30 13:10, 15F
→
08/30 13:10, , 16F
08/30 13:10, 16F
→
08/30 13:14, , 17F
08/30 13:14, 17F
→
08/30 13:14, , 18F
08/30 13:14, 18F
→
08/30 13:15, , 19F
08/30 13:15, 19F
推
08/30 13:24, , 20F
08/30 13:24, 20F
→
08/30 13:27, , 21F
08/30 13:27, 21F
→
08/30 13:27, , 22F
08/30 13:27, 22F
→
08/30 13:31, , 23F
08/30 13:31, 23F
→
08/30 13:32, , 24F
08/30 13:32, 24F
→
08/30 13:33, , 25F
08/30 13:33, 25F
→
08/30 13:34, , 26F
08/30 13:34, 26F
→
08/30 13:35, , 27F
08/30 13:35, 27F
→
08/30 13:36, , 28F
08/30 13:36, 28F
→
08/30 13:38, , 29F
08/30 13:38, 29F
→
08/30 13:38, , 30F
08/30 13:38, 30F
→
08/30 13:57, , 31F
08/30 13:57, 31F
→
08/30 13:58, , 32F
08/30 13:58, 32F
→
08/30 13:59, , 33F
08/30 13:59, 33F
推
08/30 15:10, , 34F
08/30 15:10, 34F
→
08/30 15:11, , 35F
08/30 15:11, 35F
→
08/30 15:14, , 36F
08/30 15:14, 36F
→
08/30 15:14, , 37F
08/30 15:14, 37F
→
08/30 15:15, , 38F
08/30 15:15, 38F
→
08/30 15:16, , 39F
08/30 15:16, 39F
→
08/30 15:16, , 40F
08/30 15:16, 40F
→
08/30 15:17, , 41F
08/30 15:17, 41F
推
08/30 15:18, , 42F
08/30 15:18, 42F
→
08/30 15:18, , 43F
08/30 15:18, 43F
→
08/30 15:19, , 44F
08/30 15:19, 44F
→
08/30 15:20, , 45F
08/30 15:20, 45F
→
08/30 15:20, , 46F
08/30 15:20, 46F
→
08/30 15:21, , 47F
08/30 15:21, 47F
→
08/30 15:21, , 48F
08/30 15:21, 48F
→
08/30 15:23, , 49F
08/30 15:23, 49F
→
08/30 15:23, , 50F
08/30 15:23, 50F
→
08/30 21:40, , 51F
08/30 21:40, 51F
→
08/30 21:40, , 52F
08/30 21:40, 52F
→
08/30 21:42, , 53F
08/30 21:42, 53F
→
08/30 21:43, , 54F
08/30 21:43, 54F
→
08/30 21:43, , 55F
08/30 21:43, 55F
→
08/30 21:45, , 56F
08/30 21:45, 56F
→
08/30 21:45, , 57F
08/30 21:45, 57F
→
08/30 22:07, , 58F
08/30 22:07, 58F
→
08/30 22:08, , 59F
08/30 22:08, 59F
→
08/30 22:09, , 60F
08/30 22:09, 60F
→
08/30 22:09, , 61F
08/30 22:09, 61F
→
08/30 22:10, , 62F
08/30 22:10, 62F
→
08/30 22:11, , 63F
08/30 22:11, 63F
→
08/30 22:11, , 64F
08/30 22:11, 64F
→
08/30 22:12, , 65F
08/30 22:12, 65F
→
08/30 22:12, , 66F
08/30 22:12, 66F
→
08/30 22:12, , 67F
08/30 22:12, 67F
→
08/30 22:13, , 68F
08/30 22:13, 68F
→
08/30 22:13, , 69F
08/30 22:13, 69F
→
08/30 22:17, , 70F
08/30 22:17, 70F
→
08/30 22:18, , 71F
08/30 22:18, 71F
→
08/30 22:18, , 72F
08/30 22:18, 72F
→
08/30 22:19, , 73F
08/30 22:19, 73F
推
08/30 23:14, , 74F
08/30 23:14, 74F
推
08/30 23:29, , 75F
08/30 23:29, 75F
推
08/30 23:30, , 76F
08/30 23:30, 76F
→
08/30 23:34, , 77F
08/30 23:34, 77F
推
08/31 01:01, , 78F
08/31 01:01, 78F
推
08/31 08:48, , 79F
08/31 08:48, 79F
推
08/31 21:51, , 80F
08/31 21:51, 80F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章