1

静态变量存在于函数之外,至少就它们的内存而言(不是范围),对吧?但是我一直关心的一件事是,当我第二次调用该函数时会发生什么。例如:

f(){
    static char buffer[256*256];
    stuff(buffer);
}

当我第二次调用这个函数时,它在技术上不是第二次声明变量“缓冲区”吗?还是编译完所有内容后,它对静态变量(与普通变量相反)的工作方式是否不同?

...我有时希望有一个图表或 C++ 编译器通常将代码转换成的东西(减去优化),这样我就不必为这样的小问题打扰你们了,啊哈。先感谢您!

编辑:我知道它是这样工作的,但我只是想知道为什么。这可能是一件令人麻木的简单事情......

4

5 回答 5

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 => 静态存储持续时间对象。

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
于 2011-03-03T22:33:48.413 回答
3

不,您static的意思是它超出了您的功能范围。和写的效果一样:

static char buffer[256*256];

f(){
    stuff(buffer);
}

除了缓冲区仅在您的函数范围内可见,并且代码更具可读性。

(注意:当 char 不是原始类型时,我的示例不适用 - 在这种情况下,它是在第一次“声明”时构造的)。

于 2011-03-03T22:06:47.407 回答
1

在这种情况下,static意味着变量具有应用程序生命周期。它在main()进入函数之前分配,并在main()返回后释放。此外,它的值在函数调用之间保留。将其视为仅在该函数内部可见的全局变量。

于 2011-03-03T22:07:37.763 回答
0

该变量在您调用函数之前和之后都存在......它是静态的。

于 2011-03-03T22:05:25.993 回答
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() 的所有调用中更改它。

于 2011-03-03T22:10:01.857 回答