是否有充分的理由在每次调用函数时初始化静态变量?

时间:2013-06-13 16:33:49

标签: c

一位同事正在进行一些代码审查,他看到许多类似于以下内容的静态变量声明:

void someFunc(){

   static int foo;
   static int bar;
   static int baz;

   foo = 0;
   bar = 0;
   baz = 0;

   /* 
       rest of the function code goes here
   */

}

我们的问题是, 编写此代码的程序员是否只是不清楚静态变量的概念, 或者是否有一些聪明的理由故意这样做?

如果它有所不同,环境是嵌入式微控制器,编译器是GCC。

4 个答案:

答案 0 :(得分:13)

如果它不是一个嵌入式系统,你可能是正确的:我敢打赌,程序员不清楚静态的概念,并且一定要写这个:

static int foo = 0;
static int bar = 0;
static int baz = 0;

但是,在嵌入式系统中,他们可以使用static来避免在自动存储中(即在堆栈上)分配变量。这可以节省一些CPU周期,因为静态变量的地址将“融入”编译方法的二进制代码。

答案 1 :(得分:2)

在此上下文中,静态内存仅分配一次。这段代码的问题是初始化。如果它在每次执行时被重置,那么这些变量应该存在于堆栈中。

答案 2 :(得分:0)

按原样实现该功能会破坏static的好处。使用static的主要原因有:

  1. 拥有一个变量,可以在调用同一函数之间保持它的值
  2. 避免在堆栈上分配内存
  3. @dasblinkenlight回答与第二个选项有关,但嵌入式编程中没有人会浪费不可恢复的内存,以便在堆栈上保存24个字节(假设架构上int为32个字节)。原因是编译器无论如何都要操纵进入函数的堆栈指针,因此没有任何东西可以保存(就循环而言)没有将SP推送到另外24个字节。

    记住这一点,我们可以选择让用户在调用之间保留有关foobarbaz的一些信息。如果情况并非如此,你所看到的是编程错误。

答案 3 :(得分:0)

静态利益。是:

有一个变量可以在调用同一个函数之间保持它的值 避免在堆栈上分配内存