星期二, 10月 14, 2014

善用 Heap memory , 減少 Global variable 和 stack 的使用


有時候 programmer 會想要暫時儲存一些資料,
例如下面這個範例,
使用stack 來暫存一些從檔案系統讀到的資料


#define MAX    (100)


void foo() {
   T_NICKNAME friends[MAX]; //1


       /* get data from file system to friends */
       ...
       display_friends(&friends);
       ...
}


仔細看 //1 , 對嵌入式系統而言 friends 這個structure太大了(請記住你很窮)
有可能造成 stack overflow, (什麼有可能, 跟你保證一定會..)
於是 programmer 改用global variables 來儲存 (窮則變, 變則通)


例如下面這個範例


#define MAX    (100)
static  T_NICKNAME friends[MAX]; //2


void foo() {
       /* get data from file system */
       ...
       display_friends(&friends);
       ...
}


仔細看 //2, 把 friends 宣告成 global variable
這樣的作法雖然避免了stack overflow,
但是卻會消耗了系統整體可以使用的空間.


當然大多數的 programmer 不會犯這麼明顯的錯誤 (太容易被抓到了)
會發生的原因常常是想要使用 global variable 來 “暫時" 保持大量資料,
此時應該使用以下的技巧來達成
 
static T_NICKNAME *pt_friends;


/* 進入 foo 這個 AP 前先呼叫此函式,得到系統資源 */
void foo_init() {


       pt_friends = os_malloc(sizeof(T_NICKNAME * MAX));


       /* load data from file system to pt_file_name */
}


/* 離開 foo 這個 AP 前呼叫此函式,釋放系統資源 */
void foo_exit() {


       /* save data from pt_file_name to file system */


   os_mfree(pt_friends);  
}


void foo() {
   foo_init();
       …
   /* do something … */
           ...
   display_friends(pt_friends);
       …
   /* do something … */
           ...
   foo_exit();
}

除非是真的需要永久保存在記憶體當中
而且常常會需要用的變數,
才需要使用global variable 來儲存

有誰能夠舉出適當的例子嗎 ?

沒有留言: