こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

こんにちは!基本的なことなのかもしれませんが、
質問させてください。

C言語でたとえば下記のような構造体
struct {
long a;
short b;
char c;
};
を作ると、メモリイメージは
-------------------
a用の4バイトの領域
b用の2バイトの領域
c用の1バイトの領域
-------------------
となると思うのですが、
(構造体アラインメントが1バイトの場合)

C++でたとえば下記のようなクラス
class {
public:
int test(int x);

long a;
short b;
char c;
};

を作った場合、メモリイメージとしてはどのように
なるのでしょうか?
(というか、クラスのインスタンスの中で
メンバ関数はどうやって保持され、どうやって呼び出されるのでしょうか?)

どなたか、教えてください。

投稿日時 - 2004-02-11 11:53:56

QNo.776316

困ってます

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

> 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なんかを付けてみると、色々と面白いです。ポインタの勉強にもなりますし。

投稿日時 - 2004-02-12 14:34:41

お礼

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

投稿日時 - 2004-02-13 21:05:07

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

メンバ関数は、データとは全く別の領域(セグメント)にロードされます。
大抵のOSでは、実行モジュールのメモリ配置は
コードセグメント
データセグメント
ヒープ領域
スタックセグメント
に分かれていて、CPU のプロテクト機能によって、
・ある関数からデータセグメントのあるアドレスを Call したり Jamp したりできない。
・コードセグメントのメモリに対して Read/Write できない。
ようになっていると思います。
つまり、メンバ関数はコードセグメントに格納され、インスタンスのデータメンバはデータセグメント( Static ) だったりスタックセグメント( ローカル ) だったりします。

また、インスタンスごとにメンバ関数の中身が異なる訳ではないので、インスタンスごとにメンバ関数のアドレスを保持しているわけでもないと思います。コンパイル時にコンパイラが「メソッド呼び出し」を「適切なアドレスの Call 」に変換しているのでしょう。(このへんはちょっと自信なし)

投稿日時 - 2004-02-11 17:16:49

お礼

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

投稿日時 - 2004-02-11 22:09:32

あなたにオススメの質問