所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全域性變數或靜態變數(包括一些複雜型別的常量),它們所需要的空間大小可以明確計算出來,記憶體申請和釋放時機很重要,過早會丟失資料,過遲會耗費記憶體。特定情況下編譯器可以幫我們完成這項複雜的工作(增加額外的**維護記憶體空間,實現申請和釋 放)。並且不會再改變,因此它們可以直接存放在可執行檔案的特定的節裡(而且包含初始化的值),程式執行時也是直接將這個節載入到特定的段中,不必在程式執行期間用額外的**來產生這些變數。其實在運
行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,型別,作用域,生存期等等),對應的只是一塊記憶體(只有首址和大小)
所以在執行期間動態申請的空間,是需要額外的**維護,以確保不同變數不會混用記憶體。比如寫new表示有一塊記憶體已經被占用了,其它變數就不能再用它了; 寫delete表示這塊記憶體自由了,可以被其它變數使用了。
(通常我們都是通過變數來使用記憶體的,就編碼而言變數是給記憶體塊起了個名字,用以區分彼此)
從這個意義上講,區域性自動變數也是由編譯器負責分配空間的。進一步講,記憶體管理用到了我們常常掛在嘴邊的堆和棧這兩種資料結構最後對於「編譯器分配空間」這種不嚴謹的說法,
你可以理解成編譯期間它為你規劃好
gcc在編譯器的各類用途
二 gcc編譯工具的各類用途 三 程式背後的優秀 庫 四 總結與參考資料 1 將one.c檔案編譯為one.o檔案 2 將two.c檔案編譯為two.o檔案 3 將main.c檔案編譯為main.o檔案 執行ls命令,產生了.o檔案,表明編譯完成 ar crv libzxw.a one.o two....
編譯器對變數的記憶體分配方式
本文轉至 今天看到 c陷阱與缺陷 書中的一段 int i,a 10 for i 1 i 10 i a i 0 書中說 在for語句的比較部分本來是i 10 卻寫成了i 10 因此實際上並不存在的a 10 被設定為0,也就是內存在陣列a之後的乙個字 word 的記憶體被設定為0。如果用來編譯這段程式的...
原始檔在編譯器中的處理過程
預處理 1.只進行預處理操作 gcc e demo.c demo2.i 大於號的作用是把進行預處理操作後生成的.i檔案放到大於號後面的檔案裡面,稱作重定向。經過預處理之後的檔案字尾名為.i 2.預處理做的事情包括 標頭檔案展開 巨集替換 條件編譯 條件編譯在實際應用中非常多,通過條件編譯可以選擇編譯...