一位同事正在进行一些代码审查,他看到许多类似于以下内容的静态变量声明:
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。
答案 0 :(得分:13)
如果它不是一个嵌入式系统,你可能是正确的:我敢打赌,程序员不清楚静态的概念,并且一定要写这个:
static int foo = 0;
static int bar = 0;
static int baz = 0;
但是,在嵌入式系统中,他们可以使用static
来避免在自动存储中(即在堆栈上)分配变量。这可以节省一些CPU周期,因为静态变量的地址将“融入”编译方法的二进制代码。
答案 1 :(得分:2)
在此上下文中,静态内存仅分配一次。这段代码的问题是初始化。如果它在每次执行时被重置,那么这些变量应该存在于堆栈中。
答案 2 :(得分:0)
按原样实现该功能会破坏static
的好处。使用static
的主要原因有:
int
为32个字节)。原因是编译器无论如何都要操纵进入函数的堆栈指针,因此没有任何东西可以保存(就循环而言)没有将SP推送到另外24个字节。
记住这一点,我们可以选择让用户在调用之间保留有关foo
,bar
和baz
的一些信息。如果情况并非如此,你所看到的是编程错误。
答案 3 :(得分:0)
有一个变量可以在调用同一个函数之间保持它的值 避免在堆栈上分配内存