『壹』 我們經常看到書上面說的 某某變數的內存單元是編譯器在編譯時候分配的 是什麼意思
所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以
明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不
必在程序運行期間用額外的代碼來產生這些變數。
其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用
域,生存期等等),對應的只是一塊內存(只有首址和大小),
所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了;
寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)
內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實
現申請和釋 放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行。
『貳』 (C語言)編譯時給全局變數和靜態變數分配存儲空間,運行時給局部變數分配存儲空間,這樣說對嗎
全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間
全局變數本身就是靜態存儲方式, 靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一源程序的其它源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。
『叄』 靜態變數是在編譯時分配內存空間,編譯時是什麼時候編譯時都做什麼東西啊
靜態變數在編譯時進行初始化,運行階段分配內存空間。靜態變數在整個程序生命周期都是存在的。
『肆』 靜態成員在什麼時候給分配空間
你這個問題其實差不多就是問靜態成員的生存期吧,靜態成員變數可以簡單的理解為全局變數。全局變數一般是在程序剛開始運行時創建,程序結束時才銷毀。因此你在程序的整個運行期內任何時候都可以訪問到的。
『伍』 C++中局部靜態變數是在什麼時刻產生(分配內存)在編譯時,還是等運行到該變數的首次出現時
局部static 變數在程序運行的時候分配空間了,只不過作用域是局部的,生存期和全局變數一樣到程序結束
『陸』 靜態變數在內存哪分配的
內存不止分為堆和棧,還有另外3個區:
|-----------|
| 棧 |
|-----------|
| | |
| \|/ |
| |
| /|\ |
| | |
|-----------|
| 堆 |
|-----------|
| 未初始化|
|------------|
| 初始化 |
|------------|
| 正文段 |
|------------|
其中棧是由編譯器自動分配釋放,堆區是程序員申請釋放;
全局變數和靜態變數是存儲的一起的,全局未初始化變數和靜態未初始化變數放在未初始化區(又稱BSS區),全局初始化變數和靜態初始化變數放在初始化區;
代碼的二進制存放在正文段。。
『柒』 編譯器編譯高級語言為低級語言的時候,給全局變數或靜態變數是如何分配內存的
對於C和C++的編譯器,全局變數和靜態變數都是在專門的數據區保存的,更具體一點,一般是在.data和.bss段保存的,具體在哪個段,編譯器會根據代碼中是否對這些變數進行了初始化來決定,如果初始化過,並且初始化的值不為0,那麼這個這個變數一般就會被放在編譯結果的.data段中,否則就是放在.bss段中。
.data段中就保存變數的符號,還保存變數的初始化值,而在.bss段中,只保存變數的符號,而不保存值,這是因為這部分的變數都將被初始化為0,這也是為什麼static聲明的變數即使沒有初始化也會是0的原因。
這些段都會在程序被執行的時候由操作系統(或鏈接器)載入到指定的內存中,便完成相應的初始化。
『捌』 c++編譯系統在編譯時對靜態存儲變數分配存儲單元嗎
是啊,就是在編譯的時候分配的么,不過你也可以動態分配,比如malloc函數,這樣的內存是在堆中申請的,所以程序執行的時候才會申請,一般的變數什麼的,包括數組都是在棧中存放,堆就是要靠用戶管理的數據區域,棧則是有系統自動管理的。
『玖』 C語言中,給變數分配內存是在什麼時候是在編譯的時候嗎
編譯只是把源文件翻譯成可執行文件,此時如果不運行程序,分配內存干嗎?應該是在運行程序時分配內存