有關變長數組(VLA)(轉)

在忽然聽到這個名詞後,在網上搜的。
 

1. 變長數組是分配在堆棧上的, 其實從語義的角度也應該是這樣, 變長數組仍是一個數組, 仍是一個局部變量, 在c語言中, 
局部變量是分配在堆棧上的, malloc纔是分配在堆上面的. 這裏面沒有不存在什麼 
內存泄漏, 由於堆棧上的內存是不須要程序員管理的 
  
2. 變長數組和其餘變量共同存在於一個做用域以內時, 變長數組是在最後分配的, 
也就是處在堆棧的最下面(地址最低). 這也是變長數組不一樣於普通變量的狀況, 
普通變量的內存分配是按照定義順序來的, 先定義的先分配, 可是變長數組不是這樣的, 
在一個做用域內變長數組都是放到最後分配的, 緣由很簡單, 變長數組的大小在編譯時無 
法肯定, 因此若是在變長數組後面分配普通變量的空間, 那麼對後面普通變量的存取就不 
方便了,固然簡單的狀況能夠經過優化解決, 可是若是有不少的變量數組和普通變量混合 
在一塊兒的話,優化很難作到很好, 因此把變長數組都放在最後面分配, 是一個比較合理的 
辦法; 
固然, 不是說必定要放在最後, 按照普通的定義順序來分配空間也是能夠的,只是在存取 
可變數組後面的變量的時候, 須要首先找到可變數組的起始地址, 而後再往下(低地址) 
找到後面變量的地址, 存取相應的變量.我目前所使用的gcc放到最後的作法, 也能夠理解 
成一種優化. 
  
  
3. 對變長數組的元素存取, 能夠把首地址放在寄存器裏面, 也能夠在把首地址放在堆棧 
裏面,而後存取元素的時候先取出首地址, 而後在經過偏移量的方式存取裏面的元素. 
  
4.變長數組不能在靜態存儲區中, 這個很顯然, 靜態存儲區在編譯時就肯定分配內存的 
大小,不像堆棧同樣是動態的, 變長數組顯然不能定義在靜態存儲區中. 
  

5. 變長數組的意義, 我以爲在c裏面仍是有一些意義, 若是是在對性能,內存要求十分嚴 
格的地方, 容許聲明變長數組仍是比較方便的, 由於原來須要一塊連續內存的地方要麼 
聲明的大一些,保證確定夠用, 但這樣就浪費了, 在對內存要求嚴格的地方就很差了, 
另一種作法就是malloc動態分配, 可是這樣的缺點是須要手動管理, 要手動free, 
程序若是大的話內存管理很差的話容易內存泄漏,因此在c裏面仍是有一些意義. 
可是在c++裏面已經有vector了, 並且c++也不太多應用在對性能,內存要求很是高的地方, 
  
6.使用變長數組, 最重要的固然是要檢查數組的size的合法性了, 
我前面舉例爲了減小干擾因素, 都沒有作檢查, 實際的程序確定要作這個檢查。
另外, 就是又多了一種堆棧溢出的方法,數組大小若是是負的話又能夠跳到不應跳到 
的地方了 
html

相關文章
相關標籤/搜索