12

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

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

4 回答 4

13

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

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

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

于 2013-06-13T16:36:20.677 回答
2

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

于 2013-06-13T16:38:11.283 回答
0

静态的好处。是:

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

于 2013-06-13T21:03:10.333 回答
0

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

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

@dasblinkenlight 答案与第二个选项有关,但是嵌入式编程中没有人会浪费不可恢复的内存以int在堆栈上节省 24 个字节(假设您的体系结构上是 32 个字节)。原因是编译器无论如何都会操纵进入函数的堆栈指针,因此没有什么可以节省(就周期而言)不让它再将 SP 推 24 个字节。

牢记这一点,我们留下了用户想要在通话之间维护一些关于 和 的信息的foo选项barbaz如果也不是这种情况,那么您所看到的是糟糕的编程。

于 2013-06-13T18:57:41.130 回答