静态成员函数的局部变量

时间:2010-03-03 15:52:16

标签: c++

今天我们遇到了一个涉及多线程环境中静态成员函数的问题。我们问自己但无法找到令人满意的答案的问题是: 静态成员函数的局部变量也是静态的吗?

// header

class A
{
  static int test();
}

// implementation
int A::test()
{
  int a = rand();
  int b = rand();
  int c = a + b;

  return c;
}

假设您有两个线程都调用A :: test()。是否有可能当线程1进程c = a + b线程2进入test()并通过分配rand()的新返回值来更改a的值,或者换句话说,两个线程都运行一些线程a,b和c的内存位置?

4 个答案:

答案 0 :(得分:18)

没有。堆栈帧对于每个线程调用函数是独立的,并且每个都有自己的本地。 (如果您正在访问实际的共享数据,例如类中的静态成员,则需要小心。)

答案 1 :(得分:2)

除非明确声明为静态,否则不是。它们位于堆栈上,每个线程都有一个单独的堆栈。

答案 2 :(得分:1)

a,b和c的存储类是(隐式)auto,通常意味着在调用堆栈上。它们不会从方法签名中“继承”静态存储类(这是静态的不同含义(对于严重超载的关键字而言是yay!)。

答案 3 :(得分:0)

不,a,b和c不是静态的。

以下是一个说明这一点的示例:

class Val
{
public:
    Val() { cout << "Val" << this << endl; }
    ~Val() { cout << "~Val" << this << endl; }
    int n_;
};

class A
{
public:
    static int test()
    {
        Val a;
        a.n_ = rand();
        Val b;
        b.n_ = rand();
        Val c;
        c.n_ = a.n_ + b.n_;
        return c.n_;
    }
};

int main()
{
    srand(time(0));
    for( int i = 0; i < 5; ++i )
    {
        cout << "Test = " << A::test() << endl;
    }

    return 0;

}