静态变量存在于函数之外,就其内存而言至少(不是范围),对吧?但有一件事总是让我担心,就是当我第二次调用这个函数时会发生什么。例如:
f(){
static char buffer[256*256];
stuff(buffer);
}
当我第二次调用此函数时,技术上不会再次声明变量'buffer'吗?或者,一旦编译完所有,它与静态变量(与普通变量相反)的工作方式不同吗?
...我有时希望有一个图表或某些c ++编译器通常会将代码转换为(减去优化),所以我不必打扰那些像这样的小问题的好人,啊哈。提前谢谢!
编辑:我知道它的工作方式是这样的,我只是想知道为什么。这可能是令人头脑麻木的简单......
答案 0 :(得分:3)
不,您static
表示它超出了您的功能范围。它与写作具有相同的效果:
static char buffer[256*256];
f(){
stuff(buffer);
}
除了缓冲区仅在函数范围内可见,并且代码更具可读性。
(注意:当char不是基本类型时,我的示例不适用 - 在这种情况下,它是在第一次“声明”时构造的。)
答案 1 :(得分:3)
功能范围内的静态存储持续时间对象。
首次使用时会创建这些对象 然后以相反的创建顺序销毁(使用其他静态存储持续时间对象)。
#include <iostream>
class X
{
public:
X(int x): m(x) {std::cout << "X: " << m << " created\n"; }
~X() {std::cout << "X: " << m << " destroyed\n";}
private:
int m;
};
static X x1(1);
int test()
{
std::cout << "Test: Start\n";
static X x3(3);
std::cout << "Test: Finished\n";
return 5;
}
int main()
{
std::cout << "Main: Start\n";
X x2(2);
test();
X x4(4);
std::cout << "Main: Finished\n";
}
现在尝试一下:(评论补充)。 SSDO =&gt;静态存储持续时间对象。
g++ X.cpp
./a.out
X: 1 created // SSDO file scope.
Main: Start
X: 2 created
Test: Start
X: 3 created // SSDO created on first use (Notice not destroyed)
Test: Finished
Test: Start // Notice not created here.
Test: Finished
X: 4 created
Main: Finished
X: 4 destroyed
X: 2 destroyed // Main now really finished. after destroying local variables.
X: 3 destroyed // Destroy SSDO in reverse order of creation. (3 - 1)
X: 1 destroyed
答案 2 :(得分:1)
在此上下文中,static
表示变量具有应用程序生存期。它在 之前分配,输入函数,并在main()
main()
返回后取消分配。此外,它的值在函数调用之间保留。将其视为一个全局变量,只能从该函数内部看到。
答案 3 :(得分:0)
变量存在于调用函数之前和之后......它是静态的。
答案 4 :(得分:0)
这个例子可以说明一下:
#include <iostream>
using namespace std;
void test() {
static int i = 123;
if (i == 123) {
i = 321;
}
cout << i << endl;
}
int main(int arg, char **argv) {
test();
test();
return 0;
}
输出结果为:
321
321
所以“i”只在遇到第一次时被初始化,可以这么说。但实际上它是在编译时为该函数分配的。之后,它只是在函数test()的范围内作为变量,但它是静态的,所以更改它会在以后对test()的所有调用中改变它。