close
雖然是分類是放在「面試」,其實這不是面試題目,只是如果面試出這題的話,我不確定能給出滿意的回答。
這段 code 是睡前突然想到,筆者以前看到一段,自己想不透為什麼那麼做的 code,憑印象寫一下。
Code Snippet
- // initialize
- const size_t MB = 1024 * 1024 ;
- char * reverse = (char*)malloc(100 * MB); // (!) Q1
- // real using variable
- const size_t NEED = 2000;
- int * my_var = malloc(sizeof(*my_var) * NEED);
- int * tmp;
- /* do something */
- free(my_var);
- tmp = malloc(sizeof(*tmp)); // (!) Q2
- free(tmp);
- /* do something */
- // at end
- free(reverse);
- tmp = malloc(sizeof(*tmp)); // (!) Q2
- free(tmp);
後來看了一些書,推斷可能原因
(1) Q1 的地方應是為了怕後面在 allocate memory 時,記憶體不夠用,先取得一份出來,等到 allocate fail 時,先發警告訊息給 client,告知所剩記憶體不夠,希望能放一些資源出來,或能讓程式做存檔動作;再不行的話把那 100 MB 放出來,看能不能正常取得。但那份記憶體從頭到底沒在用,我很懷疑會不會被 compiler O.P.T 掉。
(2) Q2 幾乎是被我納為「年度十大納悶程式碼」之首。為何每次在釋放一塊 heap 後,馬上又配置一小塊記憶體、再釋放?唯一的猜測,大概和作業系統對記憶體管理機制有關吧。若作業系統管理的機制是,在 free 時並不馬上釋放,等累積到一定數量,或有 allocate 動作時,再一次進行處理,那麼這麼做的原因倒可以解理。一樣的疑惑 - 會不會被 compiler O.P.T 掉。
全站熱搜
留言列表