簡體   English   中英

靜態成員函數的局部變量

[英]local variables of static member functions

今天,我們遇到了一個涉及多線程環境中靜態成員函數的問題。 我們問自己並且找不到令人滿意的答案的問題是:靜態成員函數的局部變量是否也是靜態的?

// 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的值,或者換句話說,兩個線程都運行一些內存位置,b和c?

不會。堆棧幀對於每個線程調用函數是獨立的,並且每個都有自己的本地。 (如果您正在訪問實際的共享數據,例如類中的靜態成員,則需要小心。)

除非明確聲明為靜態,否則不是。 它們位於堆棧中,每個線程都有一個單獨的堆棧。

a,b和c的存儲類是(隱式)auto,通常意味着在調用堆棧上。 它們不會從方法簽名中“繼承”靜態存儲類(這是靜態的不同含義(對於嚴重超載的關鍵字而言是yay)!)。

不,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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM