共有ライブラリ内の動的にリンクされたグローバル変数と静的変数
ロード時の動的リンク
アプリケーションがロード時リンクを使用してモジュール A に動的にリンクすると、オペレーティング システムは、DLL のコードとデータをアプリケーションのアドレス空間にロードします。アプリケーションには、A のグローバル変数と静的変数の独自のコピーがあり、そのデータ セグメントにロードされます。
ランタイム ダイナミック リンク
ランタイム ダイナミック リンクでは、アプリケーションは、必要な場合にのみ DLL のコードとデータをロードします。アプリケーションは、A のグローバル変数と静的変数の独自のコピーを取得しません。代わりに、ロードされた DLL から直接アクセスします。
可視性とスコープ
いずれの場合も、静的変数は、それが定義されているモジュール内でのみ表示されます。ただし、グローバル変数には異なる可視性ルールがあります:
Windows:
Unix 系システム:
複数のアプリケーション
複数のアプリケーションがモジュール A および B を使用する場合、グローバル変数と静的変数の個別のコピーがアプリケーションごとに作成されます。それらは異なるプロセスにあります。
アプリケーションへの DLL アクセスグローバル
DLL は、リンク先のアプリケーションのグローバル変数に直接アクセスできません。アプリケーションのグローバル変数を操作するには、DLL はアプリケーションによって提供されるエクスポート関数を使用する必要があります。
結論
動的にリンクされた共有におけるグローバル変数と静的変数の動作ライブラリは Windows と Unix 系システムの間で異なります。 Windows ではモジュール間のグローバルの厳密な分離が強制されますが、Unix 系システムではロード時の動的リンク中にグローバルの共有が許可されます。一般に、共有ライブラリを使用する場合は、グローバル変数の使用を避けることをお勧めします。
以上がグローバル変数と静的変数は、異なるオペレーティング システム間で動的にリンクされた共有ライブラリでどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。