[英]Can initialization order of global variables across TUs be forced with C++17 inline members?
[英]Why do global inline variables and static inline members in C++17 need guards?
從C ++ 17開始,可以使用inline
關鍵字初始化頭文件中的全局變量和靜態成員。 雖然我理解為什么需要保護函數中的靜態變量(因為即使在多線程上下文中初始化也只發生一次),我不明白為什么這些新的內聯變量也受到保護(你可以在這里看到它: https:// godbolt.org/z/YF8PeQ )。 我認為在任何情況下,所有全局變量和靜態成員的初始化都發生在程序執行開始時(甚至在main()
之前),所以此時不需要考慮多個線程。 你能解釋一下嗎?
包含該定義並使用它的每個文件都將嘗試初始化該變量。 即使這種情況是串行發生的,而不是同時發生的,你仍然需要一種方法將變量標記為初始化,這樣只有第一次發生才會初始化它,以后稍微嘗試初始化它就不會做任何事情。
此外,您可以在main
啟動之前擁有多個線程。 全局變量的構造函數(以及那些構造函數調用的函數)可以生成新線程。
所以你可以有多段代碼,都在main
之前執行,都試圖初始化同一個變量。 這就是守衛的用武之地。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.