具体来说,如果该函数被调用n次,那么在数据段中是否会有该变量的n个副本?还是该变量有一个插槽,每次调用该函数时都会回收该插槽?
答案 0 :(得分:4)
还是该变量有一个插槽,每次调用该函数时都会回收该插槽?
在程序的内存空间中,该变量只有一个“槽”。每次执行该函数时都会使用它,即使该函数以递归方式回调自身或两个线程同时执行该函数。
这就是为什么您应该小心使用静态局部语言的原因,因为它们会使函数成为非线程安全的。或者,您可以使用线程本地存储,但这不是Portable C的一部分,也可以使用作为函数参数传递的上下文对象。
所以这个:
int foo( int x ) {
static int y = 5;
return y += x;
}
等效于此:
int y = 5; // if you add the `static` modifier then that restricts the scope of `y` to just this file, it does not affect its lifetime or storage semantics.
int foo( int x ) {
return y += x;
}