const、static變量存儲位置

理論在後面。

我們將以下面的例子介紹const變量和static變量的存放位置:

static int  val_a = 1 ; // 初始化的靜態變量 

int  val_b = 2 ;        // 全局變量 

const int  val_c = 3 ;  // const 全局變量 

static int  val_d ;     // 未初始化的靜態變量 

int  val_e ;            // 未初始化的全局變量

int main()

{

    static int val_f = 5;  // 初始化的局部靜態變量

    static int val_g;      //未初始化局部靜態變量

    int    val_h = 6;      //初始化局部變量

    int    val_i;          //未初始化局部變量

    const  int val_j = 7;  //const局部變量

    return 0;

}

①static無論是全局變量還是局部變量都存儲在全局/靜態區域,在編譯期就爲其分配內存,在程序結束時釋放,例如:val_a、val_d、val_f、val_g。

②const全局變量存儲在只讀數據段,編譯期最初將其保存在符號表中,第一次使用時爲其分配內存,在程序結束時釋放,例如:val_c;const局部變量存儲在棧中,代碼塊結束時釋放,例如:val_j。

③全局變量存儲在全局/靜態區域,在編譯期爲其分配內存,在程序結束時釋放,例如:val_b、val_e。

④局部變量存儲在棧中,代碼塊結束時釋放,例如:val_h、val_i。

注:當全局變量和靜態局部變量未賦初值時,系統自動置爲0。


我們說的data(初始化的段)   bbs段(未初始化的段) 都是針對全局變量和靜態變量來說的.

data又分爲讀寫數據段(rw data) 和 只讀數據段(ro data)

bbs是未初始化的全局變量和靜態變量和 初始化爲0 的全局變量和靜態變量.

我們在函數裏面的定義的局部變量(除static xxx)都是在stack or  heap裏面.  

bbs段不影響a.out的大小,bbs段的數據用佔位符標示而已,不在a.out裏面.運行才產生.

stack heap也都是在運行的時候產生.


堆棧區(stack),堆棧是由編譯器自動分配釋放,存放函數的參數值,局部變量的值等.棧的申請是由系統自動分配,如在函數內部申請一個局部變量 int h,同時判別所申請空間是否小於棧的剩餘空間,如若小於的話,在堆棧中爲其開闢空間,爲程序提供內存,否則將報異常提示棧溢出。  

其次是堆(heap),堆一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收 。堆的申請是由程序員自己來操作的,在C中使用malloc函數,而C++中使用new運算符,但是堆的申請過程比較複雜。



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