首頁 >後端開發 >C++ >全域變數和靜態變數在不同作業系統的動態連結共享庫中的行為如何?

全域變數和靜態變數在不同作業系統的動態連結共享庫中的行為如何?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-11 05:45:14855瀏覽

How Do Global and Static Variables Behave in Dynamically Linked Shared Libraries Across Different Operating Systems?

共享庫中動態鏈接的全局變量和靜態變量

加載時動態鏈接

當應用程式透過載入時連結動態連結到模組 A時,作業系統會載入DLL的程式碼和資料進入應用程式的位址空間。應用程式有自己的 A 全域變數和靜態變數的副本,載入到其資料段中。

運行時動態鏈接

透過運行時動態鏈接,應用程式僅在需要時加載 DLL 的程式碼和資料。應用程式不會獲得自己的 A 全域變數和靜態變數的副本。相反,它直接從載入的 DLL 中存取它們。

可見性和範圍

在所有情況下,靜態變數僅在定義它們的模組內可見。然而,全域變數有不同的可見性規則:

Windows:

  • 外部全域變數在定義模組之外不可見。
  • 要匯出全域變量,必須在 DLL 中使用 __declspec(dllexport) 進行聲明,並在匯入時使用 __declspec(dllimport) 進行聲明。

類 Unix 系統:

  • 外部全域變數在載入時動態連結期間載入的所有模組之間可見並共用。 🎜>

多個應用程式

如果多個應用程式使用模組A 和B,則會為每個應用程式建立其全域變數和靜態變數的單獨副本,即使它們位於不同的進程中也是如此。

DLL 對應用程式全域變數的存取

DLL 無法直接存取它們所連結的應用程式的全域變數。為了操作應用程式的全域變量,DLL 必須使用應用程式提供的導出函數。

結論

動態連結共享中全域變數和靜態變數的行為Windows 和類別 Unix 系統之間的函式庫有所不同。 Windows 強制模組之間的全域變數嚴格分離,而類別 Unix 系統允許在載入時動態連結期間共用全域變數。一般來說,建議在使用共享庫時避免使用全域變數。

以上是全域變數和靜態變數在不同作業系統的動態連結共享庫中的行為如何?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn