程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【編程好習慣】合理運用靜態全局或局部數組

【編程好習慣】合理運用靜態全局或局部數組

編輯:關於C語言

這裡的“合理運用”並不是指“使用全局數組都是合理的”,而是指在沒有辦法需要使用全局變量的情況下,或者使用全局數組能帶來一定的好處時,可以酌情使用靜態全局數組。使用靜態全局數組的前提是,這一數組的擁有者任務或模塊)具有全局生命周期。所謂全局生命周期是指,其生命周期與整個程序的生命周期是一樣的。另外,如果一個變量只需要被一個函數比如線程或任務的入口函數)使用,那完全可以將其定義為靜態局部數組。

對於多任務或多線程)環境的程序,不少任務具有全局生命周期,且這些任務可能需要獲得內存資源以實現特定的程序邏輯。對於這種情形,任務所使用的內存最好不要采用動態內存分配的方式,即不要采用malloc()或C++中的new操作符)從堆中獲取內存,取而代之的是,最好采用靜態全局數組以簡化代碼。圖1示例了thread_authenticator線程采用malloc()初始化其靜態全局變量g_aaa_eap_str_buff的代碼,圖2則示例了采用靜態全局數組的方式。

example.c
#defineMAX_PORTS64
#defineMAX_IDS              (MAX_PORTS*256)
#defineMAX_MSG_LEN4096

static char **g_aaa_eap_str_buff;

voidthread_authenticator(void *_arg)
{
g_aaa_eap_str_buff = (char **)malloc (MAX_IDS);
if (0==g_aaa_eap_str_buff) {
log_error ("Failed to allocate buffer for storing eap strings");
return;
}

for (int i=0;i <MAX_IDS;i ++) {
g_aaa_eap_str_buff[i]= (char *)malloc (MAX_MSG_LEN);
if(0==g_aaa_eap_str_buff[i]) {
log_error ("Failed to allocate buffer for storing eap strings");
}
   }

while(1) {
...
   }
}圖1
example.c
#defineMAX_PORTS64
#defineMAX_IDS              (MAX_PORTS*256)
#defineMAX_MSG_LEN4096

static char **g_aaa_eap_str_buff[MAX_IDS][MAX_MSG_LEN];

voidthread_authenticator(void *_arg)
{
while(1) {
...
   }
}圖2

采用數組的方式,其內存空間將會在編譯時期分配在.bss段或是.data段,這取決於數組是否是被初始化了的。如此一來,自然省去了對malloc()函數的調用,當然也就不存在對其返回值進行判斷這一說。

除了這裡說到的與線程相關的內存可以采用全局靜態數組的方式進行外,還存在其它很多的情形可以考慮采用靜態全局或局部)數組從而簡化代碼,比如:
1) 對於一個支持20萬用戶的電信設備,每一個用戶所需的數據結構內存可以考慮采用靜態全局或局部)數組的方式預先分配好,而不是每接入一個用戶就采用malloc()從堆中臨時分配。
2) 對於具有全局生命周期的軟件模塊,其所需的內存也可以考慮采用定義靜態全局或局部)數組的方式。

本文出自 “至簡李雲” 博客,請務必保留此出處http://yunli.blog.51cto.com/831344/247388

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved