質問

C ++では、ストレージクラス指定子staticはデータ領域からメモリを割り当てます。 「データ領域」とはという意味ですか

役に立ちましたか?

解決

Konradが言ったことに加えて、変数を静的として宣言することは、基本的には、ヒープまたはスタックではなく、プログラムのロード時に変数にメモリが割り当てられることを意味します。歴史的に、重要なアプリケーションで静的変数のみを使用することは、アプリケーションのメモリフットプリントが実行時に変更されないことを意味し、したがってリソースの制限により失敗する可能性は低くなりました。これが現在のオペレーティングシステムにも当てはまるかどうかはわかりません。

出力の一部としてマップファイルを生成するようにコンパイラーを取得すると、データを含むすべてのさまざまなセクションの内容を確認できます。

他のヒント

“データ領域”という用語に慣れていませんしかし、メモリは多くの場合、“コードセクション”に分割されます。および“データセクション”。コードは前者にあり、データは後者にあります。これがここでの意味だと思います。

古典的に、2つの間に違いはありません。ただし、最新のオペレーティングシステムの多くは、データセグメント内でコードの実行を禁止できます(CPUがこの区別をサポートしている場合)。これは、“実行なし”のように、“ NXフラグ”のキャッチフレーズで行きます。悪意のあるコードが挿入されるケースを効果的に防止できます。

/ EDIT:C ++標準では“ data area”に言及していないことに注意してください。

領域の名前は、プラットフォーム、コンパイラ、リンカによって異なります。

一般に、次のものがあります。

  • プログラムテキスト:実行可能なコードスペース。
  • constants:実行不可能な定数。
  • stack:スタック。
  • bss:大まかに" statics&quot ;; C / C ++の用語で。 " Block Started by Symbol"
  • データ:初期化されていないグローバル
  • ヒープ:実行時に割り当てられるストレージ。

この場合、問題のドキュメントは「データ領域」という名前を使用しています。従来はbssセグメントと呼ばれていました。

Cの用語では、ストレージクラス指定子" static"プログラムの存続期間中に存在し、ゼロまたは初期化子の値に初期化されるメモリを意味します。例では:

static int s_value_one;
static int s_value_two = 123;

s_value_oneの値はゼロであることが保証されており、s_value_typeの値はmain()の最初のステートメントの時点で123です。これがどうなるかは実装の問題です。

コンラッドが言ったこと。

データがコードセクションに配置されていたり、その逆の場合、データを読み取れないCPUがまだ存在することを付け加えます。これらは数十年前により一般的でしたが、組み込みの世界ではまだ生きています。

一言で言えば、リンカーは同種のシンボルをグループ化するだけです。 PCには、多くの場合、単純なコード領域とデータ領域以上のものがあります。初期化されていないデータ、読み取り専用データ、およびその他のOS依存のものの領域もあります。

ほとんどグーグルでこれらのテーマに関する詳細をここで見つけました:

データが終わる可能性のある場所はたくさんあります。通常、ローカル変数はスタックに割り当てられ、malloc(またはデフォルトバージョンの「new」)を使用してヒープに割り当てることができます。ただし、静的データは通常、プログラムの起動時に割り当てられ、最終的にはどこにでも到達する可能性があります。正確には、コンパイラ、OS、および実行可能形式までです。

Executableには多くの情報が含まれています。

実行可能ファイルには、その物理ファイル内に多くのタイプ/クラスのデータが保存されています。

egは次のとおりです

  1. 実行可能コードの指示
  2. リソース
  3. 依存関係情報(このバイナリが依存するDLL)
  4. このバイナリからエクスポートされるシンボル

etc

整理する方法が必要です

この情報はすべて.exeファイル形式内にあるため、OSはすべての情報を簡単に見つけて実行可能ファイルをロードし、動作させることができます。この目的のために、PE(portable Executable)と呼ばれる(M $ of-courseで作成された)一般的なバイナリ形式がWindowsの世界で使用されます。リストされたばかりの(およびさらに多くの)情報は、バイナリのさまざまなセクションで詳細に説明されています。

.dataセクション

そのようなセクションの1つが.dataセクションです。 .dataセクションには初期化されたすべてのグローバルデータと静的データが含まれ、.bssセクションには初期化されていないグローバルデータが含まれます。

グローバル用に別のセクションが必要な理由

まあ、グローバルはプログラムの存続期間中に存在するメモリの領域に作成され、上書き/再利用される可能性のあるスタックのような一時的なデータ構造ではないため、グローバルのように動作します。 (通常の自動変数のように)。

コンパイラ

したがって、これらの変数はヒープ内の永続的なアドレスに割り当てる必要がありますが、残念ながらコンパイル時に知ることはできません。そのため、コンパイラはすべてのグローバル変数と静的変数をこの.data / .bssセクションに配置し、これらの変数を参照する命令は.data / .bssのこれらの比較的永続的なアドレスを参照します。

リンカー

リンカが実世界で実行可能ファイルを読み込むと、これらのセクションを配置する場所を決定し、これらの一時アドレスのFIX UPを作成して、グローバルを参照する命令がプログラムの現在の実際の仮想アドレスを参照するようにしますメモリ。

.dataセクション/エリアとは何か、そしてグローバルにそのエリアのスペースを割り当てる必要がある理由と、プログラムがリアルタイムでどのように役立つかがわかりました。グーグルPE形式、リンカーおよび.dataセクションなどがリンクを取得します。

「データ領域」はヒープを指していると思いますが、ローカル変数は通常スタック上にあります。

または、この変数に割り当てられたメモリが実行可能ファイルの.dataセクションにあることを意味しますが、これはWindowsおよびPE形式に固有のものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top