シンボル

メモリセグメント

  • このエントリーをはてなブックマークに追加

この記事は、オブジェクト(実装編) からの続編です。

この記事は、絵でわかる プログラムとは何か(6)~シンボル~ の一記事です。

この記事のポイント

  • 仮想アドレス空間は、以下のようにセグメント分けされている。
    • テキストセグメント(コードセグメント)
    • データセグメント
      • 静的データセグメント・・・初期値有りデータ用
      • BSSセグメント・・・初期値無しデータ用
      • ヒープセグメント・・・可変長データ用
    • スタックセグメント
  • セグメントの情報は、セグメントテーブルで管理されている。
  • リテラルは、テキストセグメントに入れられる。
  • クラスも、テキストセグメントに入れられる。
  • オブジェクトは、フィールドデータとクラスメソッドへの参照を持ったデータ構造として、データセグメントの中の、ヒープセグメントに入れられる。

仮想アドレス空間での領域分け

メモリ利用の仕方による区分

仮想アドレス空間は、

  • テキストセグメント(コードセグメント)
  • データセグメント
    • 静的データセグメント・・・初期値有りデータ用
    • BSSセグメント・・・初期値無しデータ用
    • ヒープセグメント・・・可変長データ用
  • スタックセグメント

に分かれています。

通常、これらのセグメントの先頭アドレス(仮想アドレス)とサイズは、セグメントテーブルで管理されています。

物理アドレスは、連続領域になっていない場合もあります。

リテラル

リテラルはソースコード中にそのまま書かれているので、プログラムがメモリにロードされるのに合わせ、リテラル仮想メモリアドレス空間テキストセグメントに入ります。

オブジェクトの生成とメモリセグメント

クラスとインスタンス

データになれないクラス

クラスはオブジェクトの「分類」です。具体的な個々のオブジェクト(データ)にはなれません。よってクラス定義は、関数定義などと同様、メモリのデータセグメントにではなく、テキストセグメント(プログラム実行中書き換え不可)に記録されます。

データになれるインスタンス

それに対して、具体化されたオブジェクトのデータとして宣言され、メモリのデータセグメント(より正確にはヒープセグメント)に記録されるのが、インスタンスです。

メモリのデータセグメント(ヒープセグメント)への領域確保は、プログラム中のnew演算子で行われ、続けてプログラム中のコンストラクタ(インスタンス生成メソッド)によって、具体的データが入ったフィールドメソッドへの参照が、確保した領域へ記録されます。

instance1 = new Constructor(data1);
instance2 = new Constructor(data2);
instance3 = new Constructor(data3);

つまりインスタンスは、具体的なフィールドデータとメソッド参照の集まりとして生成されます。

メソッド参照は、テキストセグメントに記録されているクラスの中にあるメソッドへの参照です。

ヒープセグメントインスタンスを生成したら、そのインスタンスを識別するために、オブジェクト変数という識別子(ID)へ、そのインスタンスへの参照を代入します。

この記事のまとめ

仮想アドレス空間は、以下のようにセグメント分けされています。

  • テキストセグメント(コードセグメント)
  • データセグメント
    • 静的データセグメント・・・初期値有りデータ用
    • BSSセグメント・・・初期値無しデータ用
    • ヒープセグメント・・・可変長データ用
  • スタックセグメント

セグメントの情報は、セグメントテーブルで管理されています。
リテラルは、テキストセグメントに入れられます。
クラスも、テキストセグメントに入れられます。
オブジェクトは、フィールドデータとクラスメソッドへの参照を持ったデータ構造として、データセグメントの中の、ヒープセグメントに入れられます。

以上で、絵でわかる プログラムとは何か(6)~シンボル~ は終わりです。

次は、プログラムとは何か(7)~フロー~ へ進みましょう。

コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。

日本全国 オンラインレッスン にも対応しています。

知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。

  • このエントリーをはてなブックマークに追加

記事を検索

コメントを残す

*

CAPTCHA