編譯分組方案
1. 編譯時分配內存和運行時分配內存
編譯其實只是一個掃描過程,進行詞法語法檢查,代碼優化而已,編譯程序越好,程序運行的時候越高效。
我想你說的「編譯時分配內存」是指「編譯時賦初值」,它只是形成一個文本,檢查無錯誤,並沒有分配內存空間。
當你運行時,系統才把程序導入內存。一個進程(即運行中的程序)在主要包括以下五個分區:
棧、堆、bss、data、code
代碼(編譯後的二進制代碼)放在code區,代碼中生成的各種變數、常量按不同類型分別存放在其它四個區。系統依照代碼順序執行,然後依照代碼方案改變或調用數據,這就是一個程序的運行過程。
2. 程序寫好後怎麼編譯
把配置管理器選擇為Release,然後選擇菜單--生成--生成xxx(或者直接點擊綠色小箭頭運行下)就已經生成exe程序了,在bin/release文件夾下。讓你選擇release是把程序編譯成發布版,vs會自動優化代碼。如果是debug則不會。
3. 我們經常看到書上面說的 某某變數的內存單元是編譯器在編譯時候分配的 是什麼意思
所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以
明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不
必在程序運行期間用額外的代碼來產生這些變數。
其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用
域,生存期等等),對應的只是一塊內存(只有首址和大小),
所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了;
寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)
內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實
現申請和釋 放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行。
4. 求數字分組演算法,請使用C或C++語言
我的想法比較簡單。你可以將這個演算法寫成遞歸形式,第一層做組合挑選,共2^n種,第二層2
^n-1種.......。這樣可以挑選所有的組合情況,最後再比較,挑選。程序比較容易實現,但是我擔心效率。
如果需要進行智能處理,最好的方式是在遞歸過程中添加判斷和預測,這樣會提高效率,盡快搜索到好的結論。