• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オブジェクトのメモリイメージについて)

オブジェクトのメモリイメージについて

このQ&Aのポイント
  • C言語の構造体とC++のクラスにおけるオブジェクトのメモリイメージの違いについて解説します。
  • C言語の構造体では、各メンバ変数は連続したメモリ領域に割り当てられます。
  • 一方、C++のクラスでは、メンバ変数だけでなくメンバ関数もオブジェクトのメモリ領域に保持されます。

質問者が選んだベストアンサー

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

> C++でたとえば下記のようなクラス 便宜的に、「class A」としましょう。 main(){  A data_x;  A data_y;  printf("data_x.test=%p\n", data_x.test);  printf("&data_x.a=%p\n", &data_x.a);  printf("&data_x.b=%p\n", &data_x.b);  printf("&data_x.c=%p\n", &data_x.c);  printf("data_y.test=%p\n", data_y.test); } などとして、実際のアドレスを表示させてみるとよろしいです。 ちなみに、私の環境、Win2000, VC++6.0, 構造体アライメント1ですと、 data_x.test=00401005 &data_x.a=0012FF78 &data_x.b=0012FF7C &data_x.c=0012FF7E data_y.test=00401005 となりました。 関数、変数、関数内で使用する変数にstaticなんかを付けてみると、色々と面白いです。ポインタの勉強にもなりますし。

yasu54321
質問者

お礼

なるほど、なるほど! どうもありがとうございます!

その他の回答 (1)

回答No.1

メンバ関数は、データとは全く別の領域(セグメント)にロードされます。 大抵のOSでは、実行モジュールのメモリ配置は コードセグメント データセグメント ヒープ領域 スタックセグメント に分かれていて、CPU のプロテクト機能によって、 ・ある関数からデータセグメントのあるアドレスを Call したり Jamp したりできない。 ・コードセグメントのメモリに対して Read/Write できない。 ようになっていると思います。 つまり、メンバ関数はコードセグメントに格納され、インスタンスのデータメンバはデータセグメント( Static ) だったりスタックセグメント( ローカル ) だったりします。 また、インスタンスごとにメンバ関数の中身が異なる訳ではないので、インスタンスごとにメンバ関数のアドレスを保持しているわけでもないと思います。コンパイル時にコンパイラが「メソッド呼び出し」を「適切なアドレスの Call 」に変換しているのでしょう。(このへんはちょっと自信なし)

yasu54321
質問者

お礼

ありがとうございます。 クラスというのはあくまで抽象的なもので 実態はコンパイラが生成するというところ なんでしょうか? C++が今ひとつ使いにくいのは、この辺 なんですよね。。。

関連するQ&A