C ++:函数中的静态变量声明

时间:2011-03-03 22:02:00

标签: c++ function heap static-variables

静态变量存在于函数之外,就其内存而言至少(不是范围),对吧?但有一件事总是让我担心,就是当我第二次调用这个函数时会发生什么。例如:

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

当我第二次调用此函数时,技术上不会再次声明变量'buffer'吗?或者,一旦编译完所有,它与静态变量(与普通变量相反)的工作方式不同吗?

...我有时希望有一个图表或某些c ++编译器通常会将代码转换为(减去优化),所以我不必打扰那些像这样的小问题的好人,啊哈。提前谢谢!

编辑:我知道它的工作方式是这样的,我只是想知道为什么。这可能是令人头脑麻木的简单......

5 个答案:

答案 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()的所有调用中改变它。