根據(jù)大學(xué)所學(xué)的知識(shí)卤恳,我們知道程序都是需要被加載到內(nèi)存中才能被執(zhí)行的,而加載到內(nèi)存當(dāng)中的數(shù)據(jù)只能是1或0寒矿,即高電頻或低電頻突琳。那么操作系統(tǒng)如何去識(shí)別內(nèi)存中0011究竟是代碼還是數(shù)據(jù)還是函數(shù)或者常量呢?下面我們就簡(jiǎn)單說一下程序的執(zhí)行流程符相。
- 將編譯后的程序加載到操作系統(tǒng)的執(zhí)行內(nèi)存中拆融。
- 操作系統(tǒng)把加載到內(nèi)存中的數(shù)據(jù)進(jìn)行人為的分區(qū),大致分為:
- .data區(qū):常量區(qū)主巍,存放程序中的所有靜態(tài)常量冠息,相當(dāng)于java中的public static 的常量,在C語(yǔ)言中則是通過宏定義(define)聲明的常量。
- .code區(qū):方法區(qū)孕索,存放funcation編譯后的聲明和實(shí)現(xiàn)的描述(其實(shí)也是0101).
- 棧(Stack)空間:程序運(yùn)行時(shí)存放變量的空間,大小由操作系統(tǒng)指定躏碳,是一塊連續(xù)的內(nèi)存空間搞旭,訪問速度和效率比Heap要高一些。
- 堆(Heap)空間:存放對(duì)象的一塊不連續(xù)的內(nèi)存空間菇绵,訪問肄渗、存儲(chǔ)效率比棧稍低。
- 劃分好區(qū)域并將對(duì)應(yīng)的數(shù)據(jù)加載到各自分區(qū)后咬最,各個(gè)內(nèi)存分區(qū)開始配合工作翎嫡,舉例:
#include<stdio.h>
#define PI 3.1415
void swap(int* p, int* q){
int temp;
temp = *p;
*p=*q;
*q = temp;
}
int main(){
int i = 3;
int j = 5;
swap(&i,&j);
printf("i=%d\n",i);
printf("j=%d\n",j);
system("pause");
}
首先操作系統(tǒng)會(huì)將define的PI常量放到.data區(qū)中,然后從.code區(qū)尋找入口函數(shù)main()開始執(zhí)行永乌,
第一行會(huì)在椈笊辏空間中申請(qǐng)內(nèi)存空間存放int i=3;
第二行在棾岢空間中申請(qǐng)內(nèi)存存放int j=5;
第三行系統(tǒng)會(huì)去.code區(qū)尋找swap(int* p, int* q)函數(shù)并執(zhí)行圈驼,先在棧空間申請(qǐng)內(nèi)存創(chuàng)建p和q這兩個(gè)形參望几,然后申請(qǐng)棧內(nèi)存創(chuàng)建int temp...當(dāng)函數(shù)執(zhí)行完之后绩脆,棧空間發(fā)現(xiàn)p橄抹、q靴迫、temp已經(jīng)沒有程序在使用了,就會(huì)對(duì)這個(gè)幾個(gè)局部變量執(zhí)行出棧操作楼誓,騰出內(nèi)存空間玉锌;第四、第五慌随、第六行以此類推芬沉。
最后簡(jiǎn)單說一下堆內(nèi)存與malloc()函數(shù):動(dòng)態(tài)分配內(nèi)存空間躺同,也就是向Heap申請(qǐng)一塊指定字節(jié)大小的內(nèi)存。例:
#include <stdlib.h>
char *ptr = (char *)malloc(10);
ptr被存放在棧中丸逸,malloc(10)向Heap申請(qǐng)了10個(gè)字節(jié)的內(nèi)存空間用來存放字符蹋艺,當(dāng)使用完畢之后需手動(dòng)釋放