天天看點

全局變量和局部變量在記憶體中的差別

    • 程式中各資料類型在記憶體中的配置設定
    • static全局變量和普通全局變量的差別
      • 作用域不同
      • 存儲方式生存期
    • static函數和普通函數差別作用域記憶體儲存數量
    • 關于變量存取速度的相關備忘

1.程式中各資料類型在記憶體中的配置設定:

1、棧區(stack):——– 由編譯器自動配置設定釋放(存放函數的參數值, 局部變量的值等),操作方式類似于資料結構中的棧;

2、堆區(heap) :——– 由程式員配置設定釋放,如果不釋放可能由OS回收,但差別與資料結構中的堆,其配置設定方式類似于連結清單;

3、全局區/靜态區(全局變量/static):——- 全局變量和靜态static變量是放在一起的

  • 已初始化的全局var和靜态static在一個區域 .data
  • 未初始化的全局var和靜态static在相鄰的另一區域 .bss
  • 程式結束後由OS釋放;

4、文字常量區:—— 常量字元串,放在 .rodata

5、代碼區:——- 存放函數體的二進制代碼 .text

//main.c

int a = ;  //全局初始化區域.data
char *p1;   //全局為初始化 .bss

int main()
{
    int b;  //棧區
    char s[] = "instack";   //棧區
    char *p2;   //棧
    char *p3 = "hello"; //"hello\0"在常亮區,p3在棧區

    static int c = ;   //全局(即靜态初始化區)

    p1 = (char*)malloc(); //malloc配置設定的10位元組區域在 堆區
    p2 = (char*)malloc(); //同上

    strcpy(p1, "hello");    //"hello world\0"放在常量區,編譯器可能會将它與p3所指向的"hello\0"優化成一個區域
}
           

2. static全局變量和普通全局變量的差別:

1.(作用域不同)

①static是靜态的全局,作用于隻是目前源檔案的全局範圍;

隻初始化一次,防止在其他檔案單元中被引用。

②普通全局變量,作用域是整個源程式;

2. (存儲方式/生存期)

①普通變量加上static變為靜态局部變量後,存儲 區域有棧區->全局區,是以生存期也變為整個程式執行過程。

②值初始化一次,下一次依據上一次結果。

3. static函數和普通函數差別:(作用域/記憶體儲存數量)

static函數

①作用域隻能目前源檔案,也稱為内部函數,它需要在目前源檔案中說明定義;

②在記憶體中隻有一份;

普通函數

①可以在源檔案以外使用的函數,應在一個頭檔案中說明,要使用這些函數則需要包含該頭檔案;

②每個調用它的函數都維持一份拷貝;

關于變量存取速度的相關備忘:

一般來講,局部變量的速度要快于全局變量。這樣就是為什麼在函數内部定義的局部變量,尤其是在某個代碼段需要重複調用多次時,由于局部變量回放在cache緩沖區中,這裡的讀取速度較快。

但是,這不能絕對。

繼續閱讀