Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否有充分的理由在每次调用定义静态变量的函数时初始化静态变量?_C - Fatal编程技术网

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

C 是否有充分的理由在每次调用定义静态变量的函数时初始化静态变量?,c,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 */ } 我们的问题是,, 编写这段代码的程序员是否对静态变量的概念不清楚, 还是有什么聪明

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

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。

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

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

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

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

按原样实现函数会破坏
静态
的好处。使用
static
的主要两个原因是:

  • 具有一个变量,该变量在对同一函数的调用之间保持其值
  • 避免在堆栈上分配内存
  • @dasblinkenlight答案属于第二个选项,但是嵌入式编程中没有人会浪费不可恢复的内存来在堆栈上节省24个字节(假设
    int
    在您的体系结构上是32个字节)。原因是编译器将操纵进入函数的堆栈指针,因此,如果不让它将SP再推24个字节,则无需保存任何内容(以周期为单位)

    记住这一点,我们剩下的选项是,用户希望在调用之间维护有关
    foo
    bar
    baz
    的一些信息。如果情况并非如此,那么您看到的是糟糕的编程。

    静态好处。它们是:

    具有一个变量,该变量在对同一函数的调用之间保持其值
    避免在堆栈上分配内存

    当声明为静态时,它避免在堆栈中存储变量。因此,最小化堆栈大小也可能是一个原因。如果他们是故意这样做的,例如,为了减少堆栈使用,那么他们应该在评论中解释这一点。这也节省了堆栈空间,我认为这可能是更重要的一点。如果函数是递归的(尽管这会使使用静态变量变得棘手),那么它将整体节省内存。如果堆栈大小非常有限,则可能有必要避免堆栈溢出。@morningstar对一个非常好的问题的非常好的回答给出了非常好的注释。使用静态变量调用递归函数?!最好有一个很好的理由SAN迭代计数器可能用于递归函数中的静态变量。虽然堆栈和数据段之间的折衷在大多数32位微处理器中没有意义,但在资源非常有限的情况下(如许多PIC处理器或AVR处理器)可能有意义。最小的PIC有一个非常浅的硬件调用堆栈,总共只有几百字节的RAM。当然,对于有限的环境,大多数代码只是使用全局变量。甚至在片上系统包中也有一些ARM内核,RAM(和引脚数)非常小。@levengli我想你是说32位,而不是32字节吧?