您现在的位置:计算机技术学习网 > 技术中心 > 编程开发 > C >

【编程好习惯】合理运用静态全局或局部数组

来源:未知 责任编辑:智问网络 发表时间:2013-09-03 11:49 点击:

这里的“合理运用”并不是指“使用全局数组都是合理的”,而是指在没有办法需要使用全局变量的情况下,或者使用全局数组能带来一定的好处时,可以酌情使用静态全局数组。使用静态全局数组的前提是,这一数组的拥有者(任务或模块)具有全局生命周期。所谓全局生命周期是指,其生命周期与整个程序的生命周期是一样的。另外,如果一个变量只需要被一个函数(比如线程或任务的入口函数)使用,那完全可以将其定义为静态局部数组。

对于多任务(或多线程)环境的程序,不少任务具有全局生命周期,且这些任务可能需要获得内存资源以实现特定的程序逻辑。对于这种情形,任务所使用的内存最好不要采用动态内存分配的方式,即不要采用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

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Glib实例学习(2)双链表
    • C程序员要学C++吗?
    • C++中实现Singleton的正确方法
    • 编程思维训练(一)
    • 【编程好习惯】引入中间变量使程序更易读
    • 在C++中通过模板规避潜在错误
    • 在C++中通过模板去除强制转换
    • 【编程好习惯】减少搜索头文件的目录数
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1