hereで説明したように、静的変数は.BSSまたは.DATAセグメントに格納されます。動的リンクライブラリ(C/C++)での静的変数の動作
静的変数が動的リンクライブラリ内の関数内にある場合、このメモリはどこに格納されますか?この変数のストレージは、リンケージ時にリンクプロセスの.BSSまたは.DATAセグメントに割り当てられますか?
hereで説明したように、静的変数は.BSSまたは.DATAセグメントに格納されます。動的リンクライブラリ(C/C++)での静的変数の動作
静的変数が動的リンクライブラリ内の関数内にある場合、このメモリはどこに格納されますか?この変数のストレージは、リンケージ時にリンクプロセスの.BSSまたは.DATAセグメントに割り当てられますか?
静的変数は、DLLファイルの.BSSまたは.DATAセクションになります。おそらくDLLにリンクする実行可能ファイルは、それが存在することを知らないでしょう。 EXEがDLLを読み込むと、システムはDLLのデータセクションを設定し、DllMain()を呼び出します。 DLLの静的な状態が発生し、初期化されます。
はい。静的変数の別の種類の違いは以下のとおりです。
範囲
動的に初期化されるものの初期化時間。
実装(およびBSSとDATAセグメントは実装の詳細です)は、通常同じです。動的に初期化された静的関数変数を正しく初期化するには、動的初期化が必要であることを示すブール値を追加する方法もあります。
私はあなたを正しく理解していれば、複数のプロセスがこの共有ライブラリにリンクしていると、その変数はさまざまなプロセスによって起動時に「静的」な挙動をしますか? – nagul
いいえ、事実上、DLLの新しいインスタンスが接続する各プロセスに対してロードされるため、データセグメントはプロセス間で共有されません。 –
。 DLLは独自のメモリセクションを取得し、静的変数がそこに入ります。 – nagul