dポイントプレゼントキャンペーン実施中!

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

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;
};

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

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

A 回答 (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なんかを付けてみると、色々と面白いです。ポインタの勉強にもなりますし。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/02/13 21:05

メンバ関数は、データとは全く別の領域(セグメント)にロードされます。


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

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

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

お礼日時:2004/02/11 22:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!