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