導航:首頁 > 源碼編譯 > 編譯程序時就分配好了空間

編譯程序時就分配好了空間

發布時間:2022-03-30 06:41:32

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

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

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

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

如果不需要使用就不要定義全局變數,因為只要定義了,代碼又參與編譯就會分配內存,局部變數定義了編譯程序還幫著分析變數有無被使用並提示未被使用的變數,而全局變數則不會被分析是否有被使用,所以要小心使用,少做無謂的浪費,
全局變數能佔用的總空間數是有限的,超過限度時編譯器會提示且拒絕鏈接,不能生成最終執行文件

❸ C 語言源程序在編譯時,調用到的函數分配空間,沒有調用到的函數不分配空間,是嗎

所以在定義函數的時候最好按用途或功能分類,按需要包含一個頭文件,但你為了省空間也不能一個函數一個文件吧,再大再多的函數也不及資料庫、圖片或視頻文件大,如今系統內存已經達到及G時代,還在乎多幾百個函數代碼的空間?

❹ C++中,只有類,沒有對象,編譯時是否會賦予類被分配空間的能力

你說的「空間」看來是指數據呢。那確實是不會。
另外對於函數,沒有被調用到,運行時就不會給它分配對應空間,這指的也是數據空間

代碼空間的話,類或者函數,都有。

❺ C語言中函數的地址在編譯時就分配好了,為什麼不會產生地址沖突運行時剛好那個地址有別的程序在用

函數的具體武理地址不是編譯的時候分配的,是運行的時候由系統分配的!如果你看一下生成的匯編代碼你就會發現進入函數時的操作是將返回地址壓棧後通過CALL跳轉到函數開頭處執行,壓棧的函數地址都是偏移量,實際地址在運行時通過基址加減偏移量得出。另外通常程序的內存空間是專用的,兩個程序的空間互不沖突,普通用戶程序不可以訪問其他程序的內存空間!

❻ 請問運行時分配內存和編譯時分配內存有什麼區別

一。運行時分配內存
既然是運行時分配內存,首先這個一定是動態的內存。。那麼它的作用是什麼呢,它的主要應用場所就是在
事先並不知道要多少內存來存儲我們想要存的東西,比如說
偶們現在想要用內存來保存中國深圳的人口相關信息,但是這個城市有多少人呢,這個數字是不確定的隨時都是在變的,這個時候就不可能定義一個固定大小的數組來保存了,這樣就需要動態內存了,來一個就加一個,少一個就減一個多好用,是不。。嘿嘿
二。編譯時候分配的內存。。當然就是事先偶知道要多大的內存。所以就先申請固定大小的內存嘍。這個就是在編譯時候就會分配內存
三。動態的內存一經申請,只要沒有人為的釋放掉它,那麼它會一直存在,直到程序運行結束,才會被釋放。
四。。動態內存會在進程結束的時候自動釋放的。。嘿嘿。。進程都沒有了,那麼內存何在
是不。。瓶子破了,水當然會溜走,想留下也不行啊
回復libujuan

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

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

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

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

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

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

❽ 編譯時分配內存和運行時分配內存

編譯其實只是一個掃描過程,進行詞法語法檢查,代碼優化而已,編譯程序越好,程序運行的時候越高效。
我想你說的「編譯時分配內存」是指「編譯時賦初值」,它只是形成一個文本,檢查無錯誤,並沒有分配內存空間。

當你運行時,系統才把程序導入內存。一個進程(即運行中的程序)在主要包括以下五個分區:
棧、堆、bss、data、code

代碼(編譯後的二進制代碼)放在code區,代碼中生成的各種變數、常量按不同類型分別存放在其它四個區。系統依照代碼順序執行,然後依照代碼方案改變或調用數據,這就是一個程序的運行過程。

java程序是在編譯的時候分配空間的嗎,如果不是那程序在什麼時候給變數分配內存空間

編譯的時候是不會分配空間的,只是將java代碼編譯成位元組碼。是在運行這段代碼的時候才會分配。javac XX.java是編譯代碼,java XX時候是運行代碼。舉個簡單的例子:
class Cs{
int a=1;
public void print(){
System.out.print("a="+a);
}
public static void main(String args[]){
Cs c=new Cs();
c.print();
}}
當你執行到Cs c=new Cs();的時候會初始化變數。將引用變數c放入棧內存,將變數a=1放入堆內存。

❿ 定義結構體類型,說明了該類結構體數據的組織形式,在編譯程序時系統會給結構體類型分配空間。 為什麼

結構體類型是一種類型就和整型一樣,你沒有創建變數,舉個例子
int;這是一種類型這個不佔
int a;這是一個變數占內存
就和你說男的一樣,你只是說了男的,你沒有指明是誰呀
所以,只不過這個類型是你自己定義,

閱讀全文

與編譯程序時就分配好了空間相關的資料

熱點內容
租界租界pdf 瀏覽:599
ipad上pdf 瀏覽:645
程序員沒錢買房完整版 瀏覽:804
貞觀政要pdf 瀏覽:711
php列印錯誤信息 瀏覽:335
zec是什麼壓縮機 瀏覽:286
vivov3如何刷安卓60 瀏覽:180
平板電腦開機解壓 瀏覽:917
平板教師上網課用什麼app 瀏覽:888
一遵命令 瀏覽:276
比心app鎖一下是什麼意思 瀏覽:276
群暉和聯想的雲伺服器區別在哪裡 瀏覽:475
data文件夾為什麼訪問限制 瀏覽:15
鞋帽配飾網站源碼 瀏覽:355
android創始人 瀏覽:600
蘋果文件夾app怎麼加密碼 瀏覽:7
廣州本田壓縮機 瀏覽:484
php做一個考試系統 瀏覽:148
程序員用超極本 瀏覽:883
六六pdf 瀏覽:741