2012-03-01 14 views
0

我不感興趣的是有一個靜態成員混淆了我的標題,因爲它只是由cpp主體中的自由函數使用。如果我在這裏聲明一個靜態變量,那麼它只會佔用一個靜態成員的地址嗎?靜態非成員變量,它會是該程序中的所有線程相同的變量?

道歉,但在C++靜態的無數使用已經讓我很不確定。

我沿着線想:

static Osp::Base::Runtime::Monitor sharedMonitor; 
+0

我認爲http://stackoverflow.com/questions/572547/what-does-static-mean-in-ac-program/572550#572550是一個好的起點 – 2012-03-01 17:55:33

+0

@NicolasMartin:那麼一個靜態成員會這裏更好嗎? – John 2012-03-01 17:59:02

回答

0

首先,單詞「靜態」在C++兩種含義:它可以指 關鍵字static(其進而根據其中具有不同的效果它被使用),或者它可以指代一個變量的生命週期:全部 在命名空間中定義的變量具有靜態生命週期。

從你說的話來看,我認爲你正在尋找一個具有靜態 生命週期的變量,在它出現的單個翻譯單元 之外是不可見的。這樣做的優選方式是在一個未命名的名稱空間定義一個 變量:

namespace { 
int myWhatever;  // No keyword static... 
} 

所宣static類成員變量也具有靜態 壽命,因爲這樣做的局部變量(在函數內),其被聲明 static

這樣的變量在 翻譯單元中定義之後無處不在,但在其他地方沒有。它有一個實例,其中 在程序開始時出現,並且程序運行持續時間長達 。如果它有一個構造函數,那麼在main之前調用的構造函數將會是 (或者當加載動態對象時,如果使用動態鏈接),並且在調用exit調用 之後調用析構函數(或者當動態對象是卸載,如果使用動態鏈接 )。

至於線程,C++ 11具有存儲類說明 thread_local:與此說明符聲明的變量有一個實例 每個線程,具有壽命這是該 線程的等價物。它會在第一次使用之前被初始化(構建),並且當線程退出時被破壞。這與靜態的 有所不同。

1

是的。如果您在命名空間範圍內定義一個靜態變量,那麼該變量的一個實例可以在定義它的翻譯單元中訪問。

+0

我試過靜態成員的方式,但不斷得到隨機崩潰。我見過的所有示例都需要類聲明之外的某種定義,但我不明白我可以如何使用這個類來做到這一點。 – John 2012-03-01 18:17:22