為什麼要限制棧的大小?

2021-08-20 10:22:51 字數 788 閱讀 7683

棧大小不夠用不是容易出現溢位嗎?

是為了阻止不靠譜的程式設計師進入這個行業。 

當然,真正的原因其實是棧的位址空間必須連續,如果任其任意成長,會給記憶體管理帶來困難。對於多執行緒程式來說,每個執行緒都必須分配乙個棧,因此沒辦法讓預設值太大。 

當然可能有人會說64位系統上這個不是問題,但大家反正已經用了32位系統這麼多年(只有4gb甚至2gb位址空間是可以給使用者用的),已經習慣了,而且現代化的記憶體分配器通過類似slab allocator這樣的設計已經盡可能令相關資料盡可能放在一起,從cpu資料快取角度,絕大多數程式並不需要在棧上分配記憶體(題外話:棧緩衝區溢位的後果比堆緩衝區溢位要嚴重許多,而在堆上分配緩衝區則可以避免前者)。

semiconductor 寫到:

64位系統上這個不是問題,64位系統下的狀況是什麼樣的?

任何情況下必須滿足下列不等式: 

引用:

堆疊位址最大值×執行緒數目最大值《使用者態記憶體位址最大值

而64位系統上使用者態記憶體位址可以超過4g啊。 

其實無論如何都會有限制的。就算你電腦上只跑乙個單程序單執行緒,一頭是程式**,靜態資料,malloc 自由分配的堆記憶體,另一頭是堆疊。只要不停地讓堆疊生長(呼叫的函式層次足夠深,在堆疊上分配大量區域性變數,比如大陣列什麼的),由於儲存容量一定是乙個有限值,堆疊遲早要把另一頭的東西吃掉,那樣你就麻煩了。 

最常見的是寫的遞迴演算法中有錯誤,反覆壓棧,導致溢位。由於合理的演算法不會消耗太多堆疊空間,所以可以規定乙個值,超過了紅牌罰下。

_________________

棧空間大小限制

不同系統的棧空間大小不同,可通過如下方法檢視系統棧大小限制 cat proc 1 limits 該檔案列出了系統資源限制情況 ubuntu 16.04 limit soft limit hard limit units max cpu time unlimited unlimited seconds...

為什麼要限制地方臺的方言類節目????

今天看報紙,廣電總局新出台了個規定,要限制地方臺的方言節目,理由是不利於推廣普通話,進而不利於人們之間互相的交流之類云云。照我來看,狗屁不通。不知道推廣普通話的真實目的是什麼,便於交流,沒錯。大家都聽得明白,是好事,可一定要普通話才大家都聽的明白嗎?舉個例子,在趙本山紅之前,東北話全國除了東北,沒什...

為什麼要選擇ISP 為什麼要選擇AHD

在影象傳輸中,我們為什麼選擇nextchip?為什麼要選擇isp?為什麼要選擇ahd?為什麼選擇北京冠宇銘通?這個問題我倒著回答各位 一 北京冠宇銘通科技是nextchip目前為止唯一一家正式官方授權 車載產品廠家之一 二 ahd和其他幾種傳輸方式相比,擁有自己的專利,其他幾家有專利的沒有幾個,如果...