2014-09-21 66 views
3

動態加載的使用是否需要對代碼進行嚴格合法的C++特殊預防措施?動態加載是否嚴格與C++標準兼容?

C++ 11 Standard引用了某些事件的順序,例如第一次調用main()之前發生的事情。然而,動態加載似乎會將程序中事件排序的典型假設置於困境之外。

舉例來說,來自§3.6.2的引用。

靜態初始化應在任何動態初始化發生之前執行。

在動態加載的情況下,如果從字面上理解這似乎是一個幾乎不可能的義務。程序可能會產生動態初始化,然後動態加載代碼。如果該代碼包含通常會被靜態初始化的變量,則C++標準已被違反。似乎可能的是,標準所規定的事件的順序似乎仍然可以滿足,並且通過「假設」規則是合法的,但其他地方的其他人已經警告過於廣泛地解釋該規則。

+1

一個正確的程序如何可能觀察到尚未加載的代碼中的變量的初始化狀態? – 2014-09-21 09:35:46

+0

的確,這就是爲什麼我提到「如果」規則。儘管如此,我並不是專家對「假設」規則的所有含義。也許還有其他關於動態加載的角落案例。 – Praxeolitic 2014-09-21 09:38:29

+0

與其他地方可能提出的建議相反,沒有任何擺動空間可以或多或少廣泛地解釋as-if規則。在靜態初始化過程中沒有可觀察的事件發生,因此一個對象在第一次使用之前可能會在任何時候實際進行靜態初始化。 – 2014-09-21 09:57:52

回答

3

C++標準沒有爲動態模塊提供任何規定,因此需要一定量的解釋。

是的,動態加載模塊中的靜態初始化變量將在主模塊中的動態初始化變量之後初始化。你可以觀察到這一點,並構建程序對程序行爲有影響的程序。但是,如果將DLL看作是一個單獨的程序,它與主程序的內存空間共享,但擁有自己的時間軸,則可以在模塊級應用相同的規則,並使用它們來預測應用程序範圍內的行爲行爲。編譯器不想想要讓你感到驚訝...它只是有時。

順便提一句,初始化順序在C++和DLL之間的碰撞時最不關注。動態模塊打破了更多的規則,特別是當涉及到RTTI時。

+0

我真的很喜歡這個巧妙的解釋「程序」。我認爲,C++標準規定一個「程序」必須定義一個main()函數會反駁它,但對於動態加載,共享庫定義一個虛擬main()是完全可能的。 – Praxeolitic 2014-09-25 12:07:31