C++ 代碼的存儲

       一般情況由C++編譯的程序所佔用的內從分爲以下幾個方面:
         1   棧(stack)程序運行時由編譯器自動分配,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。程序結束時由編譯器自動釋放。
   2 堆(heap)在內從中開闢另一片空間,由程序員自己分配,比如(new/delete),如果程序員自己在程序結束時不釋放開闢的空間, 操作系統也會釋放此空間, 但是有例外情況, 在此不詳述,後面的文章會講到。
堆與數據結構中的鏈表類似, 並不是像數據結構中的堆。
   3 靜態存儲區(全局區) 編譯器編譯時就會分配內存,全局變量和靜態變量存儲在同一片區域, 初始化的全局變量和靜態變量存在一片區域, 而沒有初始化的全局變量存儲在另一片區域。 程序結束時由系統統一釋放。
   4
文字常量區  常量字符串就是放在這裏的。 程序結束後由系統釋放。
   5 程序代碼區—存放函數體的二進制代碼。
   對於這些解釋用下面的一個程序來說明:
   #include <iostream>
  
int a = 0; //全局初始化區
   char *p1; //全局未初始化區
   int main()
   {
   int b; //棧
   char s[] = "abc"; //棧
   char *p2; //棧
   char *p3 = "123456"; //123456在常量區,p3在棧上。
   static int c =0;//全局(靜態)初始化區
   p1 = new char[10];
   p2 = new char[20];
   //分配得來得和字節的區域就在堆區。

   }

   a 和*p1是全局變量所以存儲在靜態存儲區, 而b , s[],*p2, *p3爲局部變量都存儲在棧中, 而c雖是局部變量由於是static所以也存放在靜態存儲區(全局區),因爲它存在於全局變量中所以離開函數體時並不是立刻銷燬C, 當程序結束時才銷燬。
   其中對於堆和棧有很大的區別, 在此簡單的總結以下:
   1 管理方式不同: 棧是系統自動分配, 而對於堆來說申請釋放由用戶控制。
   2 空間大小不同: 對於棧來說通常它的大小是固定的,只是對於不同的OS也許大小不同而已, 所以只要棧的剩餘空間大於所申請空間,系統將爲程序提供內存,否則 將報異常提示棧溢出。 而堆相對來說比較大, 它只受限於計算機內有效的虛擬內存。 所以比較靈活。
   3 是否產生碎片不同: 由於new/delete的頻繁操作勢必會造成空間的浪費, 存在內存碎片, 而棧不會。
   4 生長方向不同: 棧是向內存低地址方向延伸, 而堆是向內存高地址延伸。
   5 分配方式效率不同: 由於棧是系統管理分配,所以效率會高一些。
   堆和棧各有好處, 棧的效率高, 但是分配不靈活, 對於大內存需求無法滿足, 而堆分配靈活,效率低, 也容易造成內存碎片。
   無論是堆還是棧都要防止越界, 因爲越界容易造成程序崩潰。 

   如果有錯誤請各位指出。謝謝!

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