動態加載的使用是否需要對代碼進行嚴格合法的C++特殊預防措施?動態加載是否嚴格與C++標準兼容?
C++ 11 Standard引用了某些事件的順序,例如第一次調用main()之前發生的事情。然而,動態加載似乎會將程序中事件排序的典型假設置於困境之外。
舉例來說,來自§3.6.2的引用。
靜態初始化應在任何動態初始化發生之前執行。
在動態加載的情況下,如果從字面上理解這似乎是一個幾乎不可能的義務。程序可能會產生動態初始化,然後動態加載代碼。如果該代碼包含通常會被靜態初始化的變量,則C++標準已被違反。似乎可能的是,標準所規定的事件的順序似乎仍然可以滿足,並且通過「假設」規則是合法的,但其他地方的其他人已經警告過於廣泛地解釋該規則。
一個正確的程序如何可能觀察到尚未加載的代碼中的變量的初始化狀態? – 2014-09-21 09:35:46
的確,這就是爲什麼我提到「如果」規則。儘管如此,我並不是專家對「假設」規則的所有含義。也許還有其他關於動態加載的角落案例。 – Praxeolitic 2014-09-21 09:38:29
與其他地方可能提出的建議相反,沒有任何擺動空間可以或多或少廣泛地解釋as-if規則。在靜態初始化過程中沒有可觀察的事件發生,因此一個對象在第一次使用之前可能會在任何時候實際進行靜態初始化。 – 2014-09-21 09:57:52