日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

perl学习之:编译、执行与内存关系(转)

發(fā)布時(shí)間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 perl学习之:编译、执行与内存关系(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、所謂在編譯期間分配空間指的是靜態(tài)分配空間(相對于用new動態(tài)申請空間),如全局變量或靜態(tài)變量(包括一些復(fù)雜類型的

常量),它們所需要的空間大小可以明確計(jì)算出來,并且不會再改變,因此它們可以直接存放在可執(zhí)行文件的特定的節(jié)里(而且

包含初始化的值),程序運(yùn)行時(shí)也是直接將這個節(jié)加載到特定的段中,不必在程序運(yùn)行期間用額外的代碼來產(chǎn)生這些變量。

其實(shí)在運(yùn)行期間再看“變量”這個概念就不再具備編譯期間那么多的屬性了(諸如名稱,類型,作用域,生存期等等),對應(yīng)的

只是一塊內(nèi)存(只有首址和大小), 所以在運(yùn)行期間動態(tài)申請的空間,是需要額外的代碼維護(hù),以確保不同變量不會混用內(nèi)存。

比如寫new表示有一塊內(nèi)存已經(jīng)被占用了,其它變量就不能再用它了; 寫delete表示這塊內(nèi)存自由了,可以被其它變量使用了。

(通常我們都是通過變量來使用內(nèi)存的,就編碼而言變量是給內(nèi)存塊起了個名字,用以區(qū)分彼此)

內(nèi)存申請和釋放時(shí)機(jī)很重要,過早會丟失數(shù)據(jù),過遲會耗費(fèi)內(nèi)存。特定情況下編譯器可以幫我們完成這項(xiàng)復(fù)雜的工作(增加額外

的代碼維護(hù)內(nèi)存空間,實(shí)現(xiàn)申請和釋放)。從這個意義上講,局部自動變量也是由編譯器負(fù)責(zé)分配空間的。進(jìn)一步講,內(nèi)存管理

用到了我們常常掛在嘴邊的堆和棧這兩種數(shù)據(jù)結(jié)構(gòu)。

最后對于“編譯器分配空間”這種不嚴(yán)謹(jǐn)?shù)恼f法,你可以理解成編譯期間它為你規(guī)劃好了這些變量的內(nèi)存使用方案,這個方案寫

到可執(zhí)行文件里面了(該文件中包含若干并非出自你大腦衍生的代碼),直到程序運(yùn)行時(shí)才真正拿出來執(zhí)行。

2、編譯其實(shí)只是一個掃描過程,進(jìn)行詞法語法檢查,代碼優(yōu)化而已。我想你說的“編譯時(shí)分配內(nèi)存”是指“編譯時(shí)賦初值”,它只是形成一個文本,檢查無錯誤,并沒有分配內(nèi)存空間。

當(dāng)你運(yùn)行時(shí),系統(tǒng)才把程序?qū)雰?nèi)存。一個進(jìn)程(即運(yùn)行中的程序)在主要包括以下五個分區(qū):
棧區(qū)、堆區(qū)、全局?jǐn)?shù)據(jù)區(qū)/靜態(tài)區(qū)、代碼區(qū)、常量區(qū)?

  • 棧區(qū)用來存放局部數(shù)據(jù)或者是函數(shù)的參數(shù),函數(shù)的返回值之類的變量(其中還有返回到調(diào)用函數(shù)下一條指令的地址)
  • 堆區(qū)用來存放程序中動態(tài)申請內(nèi)存的變量
  • 全局變量/靜態(tài)區(qū)用來存放程序中的全局變量或者是靜態(tài)變量,因?yàn)樗鼈兊拇笮∈谴_定的,在編譯期間就已經(jīng)進(jìn)行靜態(tài)空間的分配,而且不會改變,這樣會提高程序?qū)@些數(shù)據(jù)的訪問速度
  • 代碼區(qū)(code)用來存放編譯后的二進(jìn)制代碼
  • 常量區(qū)用來存放我們聲明的常量(const類型)

代碼(編譯后的二進(jìn)制代碼)放在code區(qū),代碼中生成的各種變量、常量按不同類型分別存放在其它四個區(qū)。系統(tǒng)依照代碼順序

執(zhí)行,然后依照代碼方案改變或調(diào)用數(shù)據(jù),這就是一個程序的運(yùn)行過程。

3、

編譯時(shí)分配內(nèi)存

---------------
編譯時(shí)是不分配內(nèi)存的。此時(shí)只是根據(jù)聲明時(shí)的類型進(jìn)行占位,到以后程序執(zhí)行時(shí)分配內(nèi)存才會正確。所以聲明是給編譯器看的

,聰明的編譯器能根據(jù)聲明幫你識別錯誤。

運(yùn)行時(shí)分配內(nèi)存
---------------
這是對的,運(yùn)行時(shí)程序是必須調(diào)到“內(nèi)存”的。因?yàn)镃PU(其中有多個寄存器)只與內(nèi)存打交道的。程序在進(jìn)入實(shí)際內(nèi)存之前要首

先分配物理內(nèi)存。

編譯過程
---------------
當(dāng)執(zhí)行這個EXE文件以后,此程序就被加載到內(nèi)存中,成為進(jìn)程。此時(shí)一開始程序會初始化一些全局對象,然后找到入口函數(shù)

,就開始按程序的執(zhí)行語句開始執(zhí)行。此時(shí)需要的內(nèi)存只能在程序的堆上進(jìn)行動態(tài)增加/釋放了。

轉(zhuǎn)載于:https://www.cnblogs.com/chip/p/4289605.html

總結(jié)

以上是生活随笔為你收集整理的perl学习之:编译、执行与内存关系(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。