導航:首頁 > 源碼編譯 > 編譯器管理作用域

編譯器管理作用域

發布時間:2022-08-16 12:47:26

1. c++中為什麼有些變數在編譯是就由編譯器分配了內存空間,還沒有運行怎麼會佔用內存呢

還沒有運行怎麼會佔用內存呢?!(這一點還要懷疑嗎!?)

所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不必在程序運行期間用額外的代碼來產生這些變數。

其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用域,生存期等等),對應的只是一塊內存(只有首址和大小),所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了; 寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)

內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實現申請和釋放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。

最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行!

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

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

3. C語言中,變數的按作用域角度分類的幾種情況

聲明不同的數據類型,你對編譯說明了這個數據的大小和運算方式,這樣編譯程序就可以分配內存的大小和位置。比如你聲明一個 int 類型的變數,編譯程序就知道分配兩個位元組,這個空間可以被用來做加、減等數學運算。 存儲類型是對編譯器說明分配空間的位置。比如一個 int 數據,被聲明為auto時,在數據區分配內存,被聲明為static時,在程序區分配內存,被聲明為寄存器時,在寄存器分配內存(但要不是操系統,不要用這個類型),外部類型是你用其它文件的外部聲明是要用。 作用域從編程的角度來講的,並不像上兩個從編譯器的角度講。也就是一個變數可以被不同的作用域使用,或說是否透明。其實外部類型也可以這么理解,但是由於外部類型的聲明用到extern關鍵字,所以常在學習過程中與自動類,寄存器類,外部類和靜態類一起學。作用域在C中是由位置決定的,在C++中類的封裝中是由public,protect,private關鍵字決定,在類內也是由位置決定的。

4. 什麼是「編譯器」

編譯信息在pe文件頭中,pe告訴系統如何分配內存。

5. C++編譯器每個具體的地方如何使用,希望幫助下

找相關書籍資料看吧,這么問太空洞了,不知如何說起。

6. C#中作用域與初始化的問題

根據編譯時的情況來看,for 塊里的代碼到底會不會執行,是未知的,因為 for 的第二項條件(i != 2)是否為 true 是要等到運行時才能知道的,編譯時不可能知道
那也就是說,因為編譯時對 d 的初次賦值是否會發生是不確定的,所以之後的代碼編譯就會出錯
而你第二張圖的代碼,那個塊里的代碼肯定會被執行的,所以編譯就不會出錯
至於第三張圖,我想或許是因為編譯器把 while(true) 看作是一定會執行的,所以也不會出錯了

7. C語言 編譯器 判斷變數作用域的方法

你要注意一點,函數內的 每個{}對的區域都是有一個上級{}的, 確定了這個關系後,在一個子{}內部,判斷變數是否定義過的過程就是, 本{}中有沒有定義,其上級{}中有沒有定義,再上級有沒有,如果必要一直判斷到全局變數。

這里有一點還要注意, 注意變數定義和{}塊的先後關系。

8. C語言中 變數作用域的區別

作用域和生存周期是完全不同的兩個概念。作用域可以看作是變數的一個有效范圍,就像網游中的攻擊范圍一樣;生存周期可以看成是一個變數能存在多久,能在那些時段存在,就像網游中的魔法持續時間……
簡單的以一個局部變數來舉個例子:
在main函數中聲明了變數a,那麼a的作用域就是main函數內部,脫離了main函數,a就無法使用了,main函數之外的函數或者方法,都無法去使用a。那麼a的生存周期是指a在那些時候存在,具體到這個例子,a什麼時候存在,要取決於main函數,或者說,main函數只要被調用,且調用沒有完成,那麼a就將存在。除此以外的情況,a都將被釋放。
生存周期也可以理解為從聲明到釋放的之間的時間。
變數具體可以分為全局變數、靜態全局變數、靜態局部變數和局部變數。
按存儲區域分:全局變數、靜態全局變數和靜態局部變數都存放在內存的全局數據區,局部變數存放在內存的棧區
按作用域分:全局變數在整個工程文件內都有效;靜態全局變數只在定義它的文件內有效;靜態局部變數只在定義它的函數內有效,只是程序僅分配一次內存,函數返回後,該變數不會消失;局部變數在定義它的函數內有效,但是函數返回後失效。
全局變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。局部變數的值不可知。

9. c++內存管理

char *a="asdfasdfasdf",你不能夠釋放a所佔的資源
關於什麼時候它的資源會釋放,要看它的作用域,如果它的作用域是局部的:比如數據塊中{},或函數中,那麼在跳出數據塊與函數後,它的內存就被釋放了,如果它的作用域為全局,或static,那麼知道程序結束後,它的內存就釋放了
int a = 10;同樣也不可以手動釋放它所佔的內存,關於它什麼時候被釋放,要看它的作用域,同上,要知道它存在哪裡,顯然它不會存在動態內存空間,那麼它只有存在於靜態內存空間與棧空間了,而究竟是靜態內存空間,還是棧空間也是由它的作用域決定,作用域為全局的就存在靜態內存空間中,作用域為局部的就存在棧內存空間中
如果你的意思是要知道a真正的地址,那麼就涉及到邏輯地址於物理地址的概念,設計到內存映射的概念
如果你感興趣需要多看點書

10. 總結Linux下的4種常用的編譯開發工具——編輯器、編譯器、調試器及項目管理器的功能。

編輯器:vi,getedit等,寫代碼用的。
編譯器:gcc/g++,把代碼編譯成二進製程序
調試器:gdb,kgdb等,調試程序用的
項目管理器:一般用eclipse等IDE來管理工程

閱讀全文

與編譯器管理作用域相關的資料

熱點內容
文件夾如何拖拽還保留原來的 瀏覽:21
職業生涯pdf 瀏覽:954
ubuntu安裝軟體php 瀏覽:159
黑馬程序員退學流程 瀏覽:362
網頁伺服器崩潰怎麼回事 瀏覽:651
cnc編程前景怎麼樣 瀏覽:320
lniux命令詳解 瀏覽:494
linuxmysql查詢日誌 瀏覽:369
老捷達夥伴壓縮比 瀏覽:94
改後綴加密 瀏覽:433
郵局選址問題演算法 瀏覽:15
河北伺服器內存雲主機 瀏覽:13
在電腦上怎麼找到加密狗圖標 瀏覽:437
電腦的瀏覽器怎麼打開pdf文件怎麼打開 瀏覽:144
pdf卡片庫下載 瀏覽:13
單片機中二進製表示什麼 瀏覽:726
java網路編程推薦 瀏覽:797
施耐德開關編程 瀏覽:68
組織胚胎學pdf 瀏覽:846
linux查看發包 瀏覽:497