一.內(nèi)存四驅(qū)模型
不知我們是否有讀過(guò) 《深入理解 java 虛擬機(jī)》這本書,強(qiáng)烈推薦讀一下吮铭。在 java 中我們將運(yùn)行時(shí)數(shù)據(jù)枷莉,分為五個(gè)區(qū)域分別是:程序計(jì)數(shù)器,java 虛擬機(jī)棧涨颜,本地方法棧费韭,java 堆,方法區(qū)庭瑰。
在 c/c++ 中我們將運(yùn)行時(shí)數(shù)據(jù)星持,分為四個(gè)區(qū)域分別是:棧區(qū),堆區(qū)弹灭,數(shù)據(jù)區(qū)督暂,代碼區(qū)。我們?cè)敿?xì)來(lái)介紹下:
- 棧區(qū):由編譯器自動(dòng)分配釋放 穷吮,存放函數(shù)的參數(shù)值逻翁,局部變量的值等。
- 堆區(qū):一般由程序員分配釋放捡鱼, 若程序員不釋放八回,程序結(jié)束時(shí)可能由 OS 回收。
- 數(shù)據(jù)區(qū):存放全局變量驾诈、靜態(tài)變量和常量字符串等等缠诅。 程序結(jié)束后由系統(tǒng)釋放。
- 存放函數(shù)體的二進(jìn)制代碼乍迄。
二.模型案例詳解
有時(shí)會(huì)想就算知道了 c/c++ 的內(nèi)存四驅(qū)模型管引,好像也沒(méi)啥作用,這東西背一下就好了闯两,其實(shí)不然褥伴。我們來(lái)看一個(gè)實(shí)例:
char* getStr(){
char buff[128];
strcpy(buff,"12345");
return buff;
}
void main(){
char* str = getStr();
printf("%s",str);
getchar();
}
請(qǐng)問(wèn)上面這個(gè)會(huì)打印啥?接下來(lái)我們?cè)賮?lái)看個(gè)實(shí)例:
// 求數(shù)組的大小
int size(int arr[]){
int size = sizeof(arr) / sizeof(int);
return size;
}
void main(){
int arr[] = {1,2,3,4,5,6};
// 求數(shù)組的大小
int size = sizeof(arr) / sizeof(int);
printf("size = %d\n",size);
size = size(arr);
printf("size = %d\n",size);
getchar();
}
請(qǐng)問(wèn)上面兩個(gè) size 的值是多少漾狼?接下來(lái)我們?cè)賮?lái)看個(gè)實(shí)例:
char* getStr1(){
char* str = "12345";
return str;
}
char* getStr2(){
char* str = "12345";
return str;
}
void main(){
char* str1 = getStr1();
char* str2 = getStr2();
printf("%d , %d",str1,str2);
getchar();
}
請(qǐng)問(wèn)上面 str1 和 str2 的地址值是否會(huì)一樣重慢?相信只要我們真正的理解了 c/c++ 的內(nèi)存四驅(qū)模型,那么這些問(wèn)題就迎刃而解了逊躁,當(dāng)然這些還只是第一步伤锚,關(guān)鍵還在于對(duì)指針的理解。
視頻地址:https://pan.baidu.com/s/1gMzvvfP8nFj9wJ6VZgSnkQ
視頻密碼:3ti3