例如下面這個範例,
使用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 來儲存
有誰能夠舉出適當的例子嗎 ?
沒有留言:
張貼留言