2017年10月20日 星期五

C/C++ 靜態函式庫中的全域變數暗藏的陷阱

Windows 平台上使用靜態函式庫時,對比其它類 Unix 平台如 Linux, BSD, Mac 等,存在一個關鍵的差異: Windows 上一個靜態函式庫在同一個程序空間 (Process space) 被 N 個程序模組 (exe, dll) 引用時, 會產生 N 份獨立的全域變數空間。而同樣的情況在其它類 Unix 平台上則是會共用同一份。



以圖例來說明:


想像一下「靜態函式庫 C」裡應用了 Singleton Pattern (背後實作基於全域變數),在 Windows 環境中使用時,卻發現在動態函式庫中、透過靜態庫 API 抓到的 Singleton 實例,竟跟在主程式中透過相同 API 抓到的 Singleton 實例,竟是完全不同的兩份實例時,會有多驚訝。相同的使用方式,在類 Unix 平台上則會抓到一樣的實例。

沒有留言:

張貼留言