雖然是分類是放在「面試」,其實這不是面試題目,只是如果面試出這題的話,我不確定能給出滿意的回答。

這段 code 是睡前突然想到,筆者以前看到一段,自己想不透為什麼那麼做的 code,憑印象寫一下。

 

Code Snippet
  1. // initialize
  2. const size_t MB = 1024 * 1024 ;
  3. char * reverse  = (char*)malloc(100 * MB);  // (!) Q1
  4.  
  5. // real using variable
  6. const size_t NEED = 2000;
  7. int  * my_var   = malloc(sizeof(*my_var) *  NEED);
  8. int  * tmp;
  9.  
  10. /*    do something    */
  11. free(my_var);
  12. tmp = malloc(sizeof(*tmp));  // (!) Q2
  13. free(tmp);
  14.  
  15. /*  do something  */
  16.  
  17. // at end
  18. free(reverse);
  19. tmp = malloc(sizeof(*tmp)); // (!) Q2
  20. free(tmp);

 

後來看了一些書,推斷可能原因

(1)  Q1 的地方應是為了怕後面在 allocate memory 時,記憶體不夠用,先取得一份出來,等到 allocate fail 時,先發警告訊息給 client,告知所剩記憶體不夠,希望能放一些資源出來,或能讓程式做存檔動作;再不行的話把那 100 MB 放出來,看能不能正常取得。但那份記憶體從頭到底沒在用,我很懷疑會不會被 compiler O.P.T 掉。

(2) Q2 幾乎是被我納為「年度十大納悶程式碼」之首。為何每次在釋放一塊 heap 後,馬上又配置一小塊記憶體、再釋放?唯一的猜測,大概和作業系統對記憶體管理機制有關吧。若作業系統管理的機制是,在 free 時並不馬上釋放,等累積到一定數量,或有 allocate 動作時,再一次進行處理,那麼這麼做的原因倒可以解理。一樣的疑惑 - 會不會被 compiler O.P.T 掉。

全站熱搜

edisonx 發表在 痞客邦 留言(2) 人氣()