導航:首頁 > 源碼編譯 > 編譯器分配單元

編譯器分配單元

發布時間:2022-10-01 09:45:45

A. c++編譯系統在編譯時對靜態存儲變數分配存儲單元嗎

是啊,就是在編譯的時候分配的么,不過你也可以動態分配,比如malloc函數,這樣的內存是在堆中申請的,所以程序執行的時候才會申請,一般的變數什麼的,包括數組都是在棧中存放,堆就是要靠用戶管理的數據區域,棧則是有系統自動管理的。

B. 我們經常看到書上面說的 某某變數的內存單元是編譯器在編譯時候分配的 是什麼意思

所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以

明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不
必在程序運行期間用額外的代碼來產生這些變數。
其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用
域,生存期等等),對應的只是一塊內存(只有首址和大小),
所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了;
寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)
內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實
現申請和釋 放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行。

C. 編譯器的組成及各部分的功能及作用

1. 詞法分析 詞法分析器根據詞法規則識別出源程序中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字元流轉換成記號流。本質上它查看連續的字元然後把它們識別為「單詞」。 2. 語法分析 語法分析器根據語法規則識別出記號流中的結構(短語、句子),並構造一棵能夠正確反映該結構的語法樹。 3. 語義分析 語義分析器根據語義規則對語法樹中的語法單元進行靜態語義檢查,如果類型檢查和轉換等,其目的在於保證語法正確的結構在語義上也是合法的。 4. 中間代碼生成 中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特徵是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現方式是四元式。三地址碼的優點是便於閱讀、便於優化。 5. 中間代碼優化 優化是編譯器的一個重要組成部分,由於編譯器將源程序翻譯成中間代碼的工作是機械的、按固定模式進行的,因此,生成的中間代碼往往在時間和空間上有很大浪費。當需要生成高效目標代碼時,就必須進行優化。 6. 目標代碼生成 目標代碼生成是編譯器的最後一個階段。在生成目標代碼時要考慮以下幾個問題:計算機的系統結構、指令系統、寄存器的分配以及內存的組織等。編譯器生成的目標程序代碼可以有多種形式:匯編語言、可重定位二進制代碼、內存形式。 7 符號表管理 符號表的作用是記錄源程序中符號的必要信息,並加以合理組織,從而在編譯器的各個階段能對它們進行快速、准確的查找和操作。符號表中的某些內容甚至要保留到程序的運行階段。 8 出錯處理用戶編寫的源程序中往往會有一些錯誤,可分為靜態錯誤和動態錯誤兩類。所謂動態錯誤,是指源程序中的邏輯錯誤,它們發生在程序運行的時候,也被稱作動態語義錯誤,如變數取值為零時作為除數,數組元素引用時下標出界等。靜態錯誤又可分為語法錯誤和靜態語義錯誤。語法錯誤是指有關語言結構上的錯誤,如單詞拼寫錯、表達式中缺少操作數、begin和end不匹配等。靜態語義錯誤是指分析源程序時可以發現的語言意義上的錯誤,如加法的兩個操作數中一個是整型變數名,而另一個是數組名等。

D. 編譯器編譯高級語言為低級語言的時候,給全局變數或靜態變數是如何分配內存的

對於C和C++的編譯器,全局變數和靜態變數都是在專門的數據區保存的,更具體一點,一般是在.data和.bss段保存的,具體在哪個段,編譯器會根據代碼中是否對這些變數進行了初始化來決定,如果初始化過,並且初始化的值不為0,那麼這個這個變數一般就會被放在編譯結果的.data段中,否則就是放在.bss段中。
.data段中就保存變數的符號,還保存變數的初始化值,而在.bss段中,只保存變數的符號,而不保存值,這是因為這部分的變數都將被初始化為0,這也是為什麼static聲明的變數即使沒有初始化也會是0的原因。
這些段都會在程序被執行的時候由操作系統(或鏈接器)載入到指定的內存中,便完成相應的初始化。

E. c語言數組在內存中是怎麼分配的

C語言使用的內存是虛擬內存。按照功能的不同在C語言中又將虛擬內存為分三類:棧區、堆區、靜態數據區,不管是單一變數還是數組,其內存分配都是這樣分的。

在棧區、靜態數據區、堆區會有編譯器負責分配、操作系統負責管理,程序員可以在堆區使用malloc()來動態分配堆內存的問題。

(5)編譯器分配單元擴展閱讀

內存的分配和釋放注意事項:

1、malloc和free是庫函數,不是系統調用

2、malloc實際分配的內存可能會比請求的多---有些編譯器分配時是以4位元組為單元的

3、不能依賴於不同平台的下的malloc

4、當請求的動態內存無法滿足時malloc返回的是NULL

5、當free的參數為NULL時,函數直接返回

F. 給變數分配內存單元是在什麼時候進行的

這個涉及到局部變數還是全局變數的問題,函數中的變數屬於局部變數,所以再調用到之後才開辟內存空間,但局部變數所在函數調用完畢,局部變數就被取消了,然後所佔內存就被收回了。 而全局變數由於作用域很廣,一旦定義,編譯器就會分配內存,程序運行期間這塊內存單元一直有效,直到整個程序結束才由系統收回內存~~

G. g++編譯器如何動態分配數組

但是靜態一維數組是編譯器分配的,對於一些情況可以檢查下標是否越界但是動態一維數組是運行時操作系統直接分配的,編譯器不會檢查下標越界的情況。兩種方式都很常見。如果已經確定下標的情況(存儲空間大小已定),直接用靜態就可以,比如用於進行緩沖的操作,一般UDP最8K的包比較合適,那麼你分配char[8192]是可以的。其他情況用動態分配比較理想。我個人一般都傾向於用動態分配,因為這樣寫出來的程序可移植性更好(不用考慮編譯器的限制)

H. 在C語言中,我不清楚內存是如何給變數分配內存單元的,聲明了就分配內存單元,還是初始化才分配內存單元

在C語言中聲明和定義是不同的,只有當你定義變數的時候系統才會給你的變數分配內存,例如int a;(是定義),extern int a;(是聲明),前者會分配,而後者不會;只要你定義變數就分配,int a;int a = 10;都是定義,都會分配!!

I. int a[100] 這400個位元組的空間編譯時並不分配

編譯時當然不分配,運行時才分配。

編譯把源程序翻譯成機器指令:「給a分配100個單元,整型」
執行程序時,操作系統按指令分配,無所謂聰明不聰明。

閱讀全文

與編譯器分配單元相關的資料

熱點內容
java引用和對象 瀏覽:509
php提交檢測 瀏覽:534
單片機最小系統介紹說明 瀏覽:155
痔核壓縮 瀏覽:879
平安口袋銀行app積分超值兌在哪裡 瀏覽:381
影視app源碼2021 瀏覽:569
驍龍處理器屬於單片機嗎 瀏覽:573
安卓怎麼下載poppy 瀏覽:40
電子賀卡哪個app好 瀏覽:579
pplive桌面文件夾刪除不了 瀏覽:86
伺服器擠爆了什麼意思 瀏覽:261
聯通app在哪裡找客服 瀏覽:239
騰訊雲自研伺服器視頻 瀏覽:285
方舟編譯器升級好嗎 瀏覽:439
演算法工程師認證 瀏覽:894
app不見了去哪裡下載 瀏覽:614
壓縮空氣系統驗證方案 瀏覽:737
雪球app在哪裡安裝 瀏覽:304
控股平台選突破選股公式源碼 瀏覽:909
從哪裡下載數字人民幣app 瀏覽:546