導航:首頁 > 源碼編譯 > 編譯器如何分配堆棧全局變數的

編譯器如何分配堆棧全局變數的

發布時間:2022-08-18 03:18:52

① 全局變數在編譯時怎麼分配空間

關於這個問題,全局變數(成員變數)是在創建對象的時候分配內存的創建對象過程為1分配空間2遞歸的創建父類對象(無父類這步可省略)3初始化成員變數4調用構造方法創建一個對象
靜態變數是在類載入的時候分配空間的,靜態變數和對象沒有關系是在jvm第一次讀到一個類的時候載入信息的過程中分配空間的類載入過程為1載入父類(如果父類已經載入過,則不在載入)2初始化靜態屬性3按順序的初始化靜態代碼塊
初始化的前提就是分配空間
而且靜態變數在以後的創建對象的時候不在初始化所以一般用靜態來保存共享信息
希望對你有所幫助

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

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

③ 程序的局部變數 全局變數 動態申請數據分別存儲在什麼地方

程序的局部變數全局變數動態申請數據分別存儲在棧里。

普通局部變數在堆棧空間上分配,當局部變數的函數被多次調用時,局部變數每次在堆棧上的位置都不相同。還可以在堆上動態分配局部變數(malloc),但是要記住在耗盡堆空間後釋放zd。

內存分配上的棧空間時要注意內存的,不能分配太多的內存。如果堆棧中的空間小於請求的空間大小,則系統將顯示堆棧溢出並給出相應的異常信息。但堆不同,堆可分配空間很大。

(3)編譯器如何分配堆棧全局變數的擴展閱讀:

注意事項:

對局部變數進行分類

1.位置:編譯器將靜態局部變數放在全局存儲區域中。數據,因此盡管它是本地的,但它存在於程序的整個生命周期中(它在定義時產生,並隨著程序的結束而結束)。

2.訪問許可權:靜態局部變數只能由其作用域內的變數或函數訪問。也就是說,盡管它將存在於程序的整個生命周期中,但是其他函數和源文件不能訪問它,因為它是靜態的。

3.值:如果用戶沒有初始化靜態局部變數,編譯器會自動將其賦值為0,每次調用靜態局部變數時都會使用最後一次調用後的值。

④ 全局變數的地址是如何確定的

無論什麼語言,全局變數的地址,都是編譯的時候就由編譯器確定好了的,是靜態的

局部變數的地址,是運行的時候,才分配的,因為它們地址都是在程序堆棧里分配的,是動態的

⑤ 局部變數 和全局變數

全局變數是整個程序都可訪問的變數,誰都可以訪問,生存期在整個程序從運行到結束(在程序結束時所佔內存釋放),而局部變數存在於模塊(子程序,函數)中,只有所在模塊可以訪問,其他模塊不可直接訪問,模塊結束(函數調用完畢),局部變數消失,所佔據的內存釋放。

操作系統和編譯器,可能是通過內存分配的位置來知道的,全局變數分配在全局數據段並且在程序開始運行的時候被載入。局部變數則分配在堆棧裡面 。

⑥ C語言中全局變數存放在內存空間中那個位置

在 C 語言中,內存分配方式有以下三種形式:

1、從靜態存儲區域分配
由編譯器自動分配和釋放,在程序編譯的時候就已經分配好內存,這塊內存在程序的整個運行期間都存在,直到整個程序運行結束時才被釋放,如全局變數與 static 變數。

2、在棧上分配
同樣由編譯器自動分配和釋放,在函數執行時,函數內部的局部變數都可以在棧上創建,函數執行結束時,這些存儲單元將則被自動釋放。

需要注意的是,棧內存分配運算內置於處理器的指令集中,它的運行效率一般很高,但是分配的內存容量有限。

3、從堆上分配
也稱為動態內存分配,由程序員手動完成申請和釋放。程序在運行的時,由程序員使用內存分配函數(如 malloc 函數)來申請內存,使用完之後再由程序員自己負責使用內存釋放函數(如 free 函數)來釋放內存。

需要注意的是,如果在堆上分配了內存空間,就必須及時釋放它,否則將會導致運行的程序出現內存泄漏等錯誤。

在 C 語言中,不同類型變數的存儲位置和作用域也有所不同。

全局變數
從靜態存儲區域分配,其作用域是全局作用域,也就是整個程序的生命周期內都可以使用。如果程序是由多個源文件構成的,那麼全局變數只要在一個文件中定義,就可以在其他所有的文件中使用,但必須在其他文件中通過使用extern關鍵字來聲明該全局變數。

全局靜態變數
從靜態存儲區域分配,其生命周期也是與整個程序同在的,從程序開始到結束一直起作用。與全局變數不同的是,全局靜態變數作用域只在定義它的一個源文件內,其他源文件不能使用。

局部變數
從棧上分配,其作用域只是在局部函數內,在定義該變數的函數內,只要出了該函數,該局部變數就不再起作用,也即該變數的生命周期和該函數同在。

局部靜態變數
從靜態存儲區域分配,其在第一次初始化後就一直存在直到程序結束。該變數的特點是其作用域只在定義它的函數內可見,出了該函數就不可見了。

⑦ 從匯編的角度考慮 全局變數在內存中是如何分配的

無論是哪種語言,全局變數都是放在數據段里的(32位以上稱數據模塊更合適),如.data,.data?,.const等,在匯編的角度,只要你改變了段寄存器的內容(雖然都是16位的段寄存器,在16位匯編里為段基址,32位里為段選擇符,都是地址的東西),無論在程序的任何位置,(16位下沒有保護,必然可以訪問;32位保護模式下,只要特權級足夠也就可以訪問),就可以訪問段中的數據,其就為全局,而在有參數傳遞或有局部變數的子程序里,這些變數存在堆棧,隨著當前主程序或字程序的不同導致使用不同的棧幀,說白了局部與臨時變數在堆棧空間里而不是在普通的數據段里,阿門。。。。

⑧ 淺談棧與堆的理解(全局變數是在堆內還是在棧內

棧:由編譯器自動分配、釋放。在函數體中定義的變數通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內存函數分配得到的就是在堆上。

閱讀全文

與編譯器如何分配堆棧全局變數的相關的資料

熱點內容
壓縮包製作後照片順序怎麼改 瀏覽:680
fibonacci數列演算法 瀏覽:775
產品經理要和程序員吵架嗎 瀏覽:252
grub2命令行 瀏覽:618
無法獲取加密卡信息 瀏覽:774
雲伺服器網卡充值 瀏覽:509
編程就是軟體 瀏覽:49
伺服器如何添加許可權 瀏覽:437
引用指針編程 瀏覽:851
手機加密日記本蘋果版下載 瀏覽:63
命令行括弧 瀏覽:176
java程序升級 瀏覽:490
排序演算法之插入類 瀏覽:227
gcccreate命令 瀏覽:73
海爾監控用什麼app 瀏覽:64
系統盤被壓縮開不了機 瀏覽:984
linuxredis30 瀏覽:541
狸窩pdf轉換器 瀏覽:697
ajax調用java後台 瀏覽:906
活塞式壓縮機常見故障 瀏覽:615