簡體   English   中英

為什么C ++ 17中的全局內聯變量和靜態內聯成員需要保護?

[英]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.

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