2009-07-28 9 views
7

hereで説明したように、静的変数は.BSSまたは.DATAセグメントに格納されます。動的リンクライブラリ(C/C++)での静的変数の動作

静的変数が動的リンクライブラリ内の関数内にある場合、このメモリはどこに格納されますか?この変数のストレージは、リンケージ時にリンクプロセスの.BSSまたは.DATAセグメントに割り当てられますか?

答えて

7

静的変数は、DLLファイルの.BSSまたは.DATAセクションになります。おそらくDLLにリンクする実行可能ファイルは、それが存在することを知らないでしょう。 EXEがDLLを読み込むと、システムはDLLのデータセクションを設定し、DllMain()を呼び出します。 DLLの静的な状態が発生し、初期化されます。

+0

私はあなたを正しく理解していれば、複数のプロセスがこの共有ライブラリにリンクしていると、その変数はさまざまなプロセスによって起動時に「静的」な挙動をしますか? – nagul

+2

いいえ、事実上、DLLの新しいインスタンスが接続する各プロセスに対してロードされるため、データセグメントはプロセス間で共有されません。 –

+0

。 DLLは独自のメモリセクションを取得し、静的変数がそこに入ります。 – nagul

1

はい。静的変数の別の種類の違いは以下のとおりです。

  • 範囲

  • 動的に初期化されるものの初期化時間。

実装(およびBSSとDATAセグメントは実装の詳細です)は、通常同じです。動的に初期化された静的関数変数を正しく初期化するには、動的初期化が必要であることを示すブール値を追加する方法もあります。

関連する問題