-
C 語言在編譯器就完成靜態變數的記憶體分配和初始化;始化發生在任何程式碼執行之前,屬於編譯期初始化。
-
C++ 全域性或靜態物件當且僅當物件首次用到時才進行構造,並透過
atexit()
來管理物件的生命期; -
靜態變數初始化是執行緒安全的。
全域性變數、檔案域的靜態變數和類的靜態成員變數在main執行之前的靜態初始化過程中分配記憶體並初始化;區域性靜態變數(一般為函式內的靜態變數)在第一次使用時分配記憶體並初始化。這裡的變數包含內建資料型別和自定義型別的物件。
非區域性靜態變數一般在main執行之前的靜態初始化過程中分配記憶體並初始化,可以認為是執行緒安全的;區域性靜態變數在編譯時,編譯器的實現一般是在初始化語句之前設定一個區域性靜態變數的標識來判斷是否已經初始化,執行的時候每次進行判斷,如果需要初始化則執行初始化操作,否則不執行。這個過程本身不是執行緒安全的。
參考:
-
https://blog.csdn.net/weixin_46645965/article/details/137012145
-
https://www.cnblogs.com/dylan-liang/p/14407237.html