函式裡的static變數初始化是執行緒安全的嗎

時間 2021-08-30 10:38:46

1樓:嬌俏老闆娘斜

靜態區域性變數具有區域性作用域。它只被初始化一次,自從第一次初始化直到程式與你新內閣結束都一直存在,他和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。   各個變數的比較區別。

    從作用域看:     全域性變數和區域性變數:全域性變數和區域性變數的區別主要在於身存週期不同,全域性變數在整個程式生成期可見,區域性變數在自己的作用域可見。

全域性變數的記憶體分配是靜態的,如果沒有賦初值,會被初始化為0。區域性變數的記憶體分配是動態的,位於堆疊中,如果沒有初始化,初值視當前記憶體內的值而定。     全域性變數具有全域性作用域。

全域性變數只需在一個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包括全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數。     靜態全域性變數也具有全域性作用域,他與全域性變數的區別在於如果程式包含多個檔案的話,他作用於定義它的檔案裡,不能作用到其他檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。

這樣即使兩個不同的原始檔都定義了相同的靜態全域性變數,他們也是不同的變數。     區域性變數也只有區域性作用域,他是自動物件,他在程式執行期間不是一直存在,而是隻在函式執行期間存在,函式的一次呼叫結束後,變數就被撤銷,其所佔用的記憶體也被收回。     靜態區域性變數具有區域性作用域。

它只被初始化一次,自從第一次初始化直到程式與你新內閣結束都一直存在,他和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。     從記憶體分配看:     全域性變數、靜態區域性變數、靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧分配空間。

    全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上沒有什麼不同。區別在於非靜態全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。

而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其他原始檔中不能使用它。由於靜態全域性變數的作用域侷限於一個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其他原始檔中引起錯誤。     一、靜態變數會被放在程式的靜態資料儲存區裡,這樣可以在下一次呼叫的時候還可以保持原來的賦值。

這一點是他與堆疊變數和堆變數的區別     二、變數用static告知編譯器,自己僅僅在變數的作用域範圍內可見。這一點是他與全域性變數的區別。     從以上分析可以看出,把區域性變數改變為靜態變數後是改變了他的儲存方式,即改變了他的生存期。

把全域性變數改變為靜態變數後是改變了他的作用域,限制了他的使用範圍,因此static這個說明符在不同的地方起的作用是不同的。     不同型別的變數在記憶體中的位置:     一、 已經初始化的全域性變數存放與data資料段;未初始化的全域性變數存放與bss資料段。

    二、 靜態的全域性變數存放與data資料段     三、 區域性變數存放在棧上。     四、 靜態區域性變數,並不是在呼叫函式時分配函式返回時釋放,而是像全域性變數一樣靜態分配,存放data資料段,但它的作用域在函式中起作用。         下圖是記憶體中的簡要分佈圖,可以更直觀的理解個型別變數在記憶體中的存放位置,圖一

2樓:匿名使用者

c++11裡面是執行緒安全的

類的成員變數一定要在建構函式裡初始化嗎

3樓:好程式設計師

可以直接賦值的,在構造裡寫只不過是為了方便,因為使用一個類的時候通常都要先new出該類的例項

在構造裡賦值,這樣在new這個類的例項的時候成員變數就已經被初始化了。方便使用而已。

c語言變數初始化的方式,C語言中變數的初始化怎麼理解?

全域性變數的初始化 對於不同編譯單位的全域性變數,其初始化的順序沒有任何的保證,因此對不同編譯單位裡的全域性變數,在它們的初始化順序之間建立依賴性都是不明智的。此外也沒辦法捕捉到全域性變數初始化丟擲的異常,一般來說要減少全域性變數的使用,特別是限制那些要求複雜初始化的全域性變數。1,儘量不用全域性變...

C 不進行中變數初始化初始化會造成什麼影響

c 不對變數初始化,可能會導致以下後果 計算結果不正確 程式邏輯與期望邏輯不一致 對於使用函式指標的程式,將導致程序崩潰。寫入硬碟的資料產生錯誤 嚴重的可能導致系統甚至硬體出現故障。看是什麼變數,靜態變數不初始化自動賦零,動態的為不確定值。若指標不初始化,則會在執行時出現崩潰,說某某記憶體不能為re...

java建構函式初始化的問題

class testperson public static void main string args 參考一下 紫風影殺 3行建構函式外面的age是類的成員變數,6行建構函式內的按格式建構函式的變數,是一個局域變數,8行輸出的是6行的那個age 9行輸出的是類的成員變數age,而類的成員變數ag...