ホームページ >バックエンド開発 >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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。