這裡的「合理運用」並不是指「使用全域性陣列都是合理的」,而是指在沒有辦法需要使用全域性變數的情況下,或者使用全域性陣列能帶來一定的好處時,可以酌情使用靜態全域性陣列。使用靜態全域性陣列的前提是,這一陣列的擁有者(任務或模組)具有全域性生命週期。所謂全域性生命週期是指,其生命週期與整個程式的生命週期是一樣的。另外,如果乙個變數只需要被乙個函式(比如執行緒或任務的入口函式)使用,那完全可以將其定義為靜態區域性陣列。
對於多工(或多執行緒)環境的程式,不少任務具有全域性生命週期,且這些任務可能需要獲得記憶體資源以實現特定的程式邏輯。對於這種情形,任務所使用的記憶體最好不要採用動態記憶體分配的方式,即不要採用malloc()(或c++中的new操作符)從堆中獲取記憶體,取而代之的是,最好採用靜態全域性陣列以簡化**。圖1示例了thread_authenticator執行緒採用malloc()初始化其靜態全域性變數g_aaa_eap_str_buff的**,圖2則示例了採用靜態全域性陣列的方式。
example.c
#define
max_ports
64#define
max_ids (
max_ports
*256)
#define
max_msg_len
4096
static char **
g_aaa_eap_str_buff;
void
thread_authenticator
(void *
_arg
)for
(int i=
0; i
<
max_ids;
i ++) }
while(1
) } 圖1
example.c
#define
max_ports
64#define
max_ids (
max_ports
*256)
#define
max_msg_len
4096
static char **
g_aaa_eap_str_buff
[max_ids
][max_msg_len
];void
thread_authenticator
(void *
_arg)}
圖2採用陣列的方式,其記憶體空間將會在編譯時期分配在.bss段或是.data段,這取決於陣列是否是被初始化了的。如此一來,自然省去了對malloc()函式的呼叫,當然也就不存在對其返回值進行判斷這一說。
除了這裡說到的與執行緒相關的記憶體可以採用全域性靜態陣列的方式進行外,還存在其它很多的情形可以考慮採用靜態全域性(或區域性)陣列從而簡化**,比如:
1) 對於乙個支援20萬使用者的電信裝置,每乙個使用者所需的資料結構記憶體可以考慮採用靜態全域性(或區域性)陣列的方式預先分配好,而不是每接入乙個使用者就採用malloc()從堆中臨時分配。
2) 對於具有全域性生命週期的軟體模組,其所需的記憶體也可以考慮採用定義靜態全域性(或區域性)陣列的方式。
程式設計好習慣
我們在編碼的時候總是希望能寫出風格良好,清晰 健壯的程式,把 當成一件藝術品來看待 來雕琢,讓 coding成為一種藝術。看了很多大牛關於程式設計風格與修養方面的文章,很受啟發,結合自己體會,簡錄幾條,提醒自己時刻注意。1.引數檢查 對於有引數的函式,首先要對引數的合法性進行檢查。可以利用asser...
程式設計好習慣
1.dry 不要重複你自己 don t repeat yourself dry是一條最容易理解但又是相對比較難以應用的原則。它是指當你在兩處或者更多的地方發現相似 時,我們應當把它們抽象成乙個新的函式,在之前重複的地方呼叫新的函式並帶上適當的引數。dry也許是最普遍的一條程式設計原則,我從未發現乙個...
C 程式設計好習慣
1.不要在建構函式中做初始化操作 要求類 尤其是對外介面類 提供init 函式,在該函式中進行相關初始化操作,初始化失敗能夠返回錯誤碼。可以規避問題 建構函式中難以返回錯誤碼,外部呼叫者無從判斷初始化結果。當該類作為全域性變數使用時,構造函式呼叫發生在main 函式執行之前,出現問題難以追蹤。2.所...