合理运用静态全局或局部数组

原创|其它|编辑:郝浩|2010-02-12 10:24:56.000|阅读 892 次

概述:这里的“合理运用”并不是指“使用全局数组都是合理的”,而是指在没有办法需要使用全局变量的情况下,或者使用全局数组能带来一定的好处时,可以酌情使用静态全局数组。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

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

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

  代码段2

  采用数组的方式,其内存空间将会在编译时期分配在.bss段或是.data段,这取决于数组是否是被初始化了的。如此一来,自然省去了对malloc()函数的调用,当然也就不存在对其返回值进行判断这一说。

  除了这里说到的与线程相关的内存可以采用全局静态数组的方式进行外,还存在其它很多的情形可以考虑采用静态全局(或局部)数组从而简化代码,比如:

  1) 对于一个支持20万用户的电信设备,每一个用户所需的数据结构内存可以考虑采用静态全局(或局部)数组的方式预先分配好,而不是每接入一个用户就采用malloc()从堆中临时分配。

  2) 对于具有全局生命周期的软件模块,其所需的内存也可以考虑采用定义静态全局(或局部)数组的方式。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP