棧內存與堆內存使用差別

棧內存:

調用函數時,主調的函數所擁有的局部變量等信息需要存儲在特定的內存區域。這個區域被稱作棧內存區。

堆內存:

另一方面,利用new或者malloc進行分配的內存區域被稱爲堆內存。

 

二者是用上的注意事項:

棧內存在程序啓動時被統一分配,此後不能再擴大。由於這一區域有上限,所以函數的遞歸深度也有上限。雖然與函數中定義的局部變量的數目有關,不過一般情況下C和C++中進行上萬次的遞歸是可以的。在Java中,在執行程序時可以用參數指定棧的大小。不同的程序設計競賽所採用的設置各有不同,建議大家預先進行確認。GCJ的話,程序是在自己的機器上執行的,所以可以自行設置參數。

全局變量被保存在堆內存區。通常不推薦使用全局變量,但是在程序設計競賽中,由於函數通常不是那麼多,並且常常會有多個函數訪問同一個數組,因此利用全局變量就很方便。此外,有時必須要申請巨大的數組,與放置在棧內存上相比,將其放置在堆內存上可以減少棧溢出的危險。同時,通常只需定義滿足最大需要的數列大小,但如果再額外定義大一些,能很好地避免粗心導致的諸如忘記保留字符串末尾的'\0'的空間之類的漏洞。


注:使用memset對已分配的內存初始化時

雖然memset按照1字節爲單位對內存進行填充,-1的每一位二進制位都是1,所以可以像( 0一樣用memset進行初始化。 通過使用memset可以快速地對高維數組等進行初始化,但是需要注意無法初始化成1之類的數值。若想初始化其他值時可使用fill函數,或者直接使用STL庫中的數據結構,比如vector初始化時:vector<vector<int>>ans(n,vector<int>(m,1));即是申請大小爲n行m列且初始值爲1的二維數組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章