本文內容非原創:自己做筆記和分享用。
內存分配方式:
1、棧區(stack)
—由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似於數
據結構中的棧。
2、堆區(heap)
—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static)
—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。
程序結束後由系統釋放。
4、文字常量區
—常量字符串就是放在這裏的。程序結束後由系統釋放。
5、程序代碼區
這是一個前輩寫的,非常詳細
//main.cpp
int a=0; //全局初始化區
char *p1; //全局未初始化區
main()
{
int b;//棧
char s[]="abc"; //棧
char *p2; //棧
char *p3="123456"; //123456\0 在常量區,p3在棧上。
static int c=0; //全局(靜態)初始化區
p1 = (char*)malloc(10);
p2 = (char*)malloc(20); //分配得來得10和20字節的區域就在堆區。
strcpy(p1,"123456"); //123456\0放在常量區,編譯器可能會將它與p3所向"123456"優化成一個地方。
}
堆棧理論知識:
堆——是由 new 分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。 另外,在 WINDOWS 下,最好的方式是用 Virtual Alloc 分配內存,他不是在堆,也不是在棧,而是直接在進程的地址空間中保留一塊內存,雖然用起來最不方便。但是速度快,也最靈活。
堆——一般是在 堆 的頭部用一個字節存放堆的大小。堆中的具體內容由程序員安排。
堆——
char s1[]="aaaaaaaaaaaaaaa";
char *s2="bbbbbbbbbbbbbbbbb";
aaaaaaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbbbbbbbb是在編譯時就確定的;
但是,在以後的存取中,在 棧 上的數組比指針所指向的字符串(例如 堆 )快。
比如:
#include
void main()
{
char a=1;
char c[]="1234567890";
char *p="1234567890";
a = c[1];
a = p[1];
return;
}
對應的彙編代碼
10:a=c[1];
004010678A4DF1movcl,byteptr[ebp-0Fh]
0040106A884DFCmovbyteptr[ebp-4],cl
11:a=p[1];
0040106D8B55ECmovedx,dwordptr[ebp-14h]
004010708A4201moval,byteptr[edx+1]
004010738845FCmovbyteptr[ebp-4],al
第一種在讀取時直接就把字符串中的元素讀到寄存器 cl 中,而第二種則要先把指針值讀到 edx 中,在根據 edx 讀取字符,顯然慢了。
堆和棧的區別可以用如下的比喻來看出:
使用 棧 就象我們去飯館裏喫飯,只管點菜(發出申請)、付錢、和喫(使用),喫飽了就走,不必理會切
菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用 堆 就象是自己動手做喜歡喫的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。