-
- 程式中各資料類型在記憶體中的配置設定
- 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緩沖區中,這裡的讀取速度較快。
但是,這不能絕對。