![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
こんにちは!基本的なことなのかもしれませんが、
質問させてください。
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;
};
を作った場合、メモリイメージとしてはどのように
なるのでしょうか?
(というか、クラスのインスタンスの中で
メンバ関数はどうやって保持され、どうやって呼び出されるのでしょうか?)
どなたか、教えてください。
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なんかを付けてみると、色々と面白いです。ポインタの勉強にもなりますし。
No.1
- 回答日時:
メンバ関数は、データとは全く別の領域(セグメント)にロードされます。
大抵のOSでは、実行モジュールのメモリ配置は
コードセグメント
データセグメント
ヒープ領域
スタックセグメント
に分かれていて、CPU のプロテクト機能によって、
・ある関数からデータセグメントのあるアドレスを Call したり Jamp したりできない。
・コードセグメントのメモリに対して Read/Write できない。
ようになっていると思います。
つまり、メンバ関数はコードセグメントに格納され、インスタンスのデータメンバはデータセグメント( Static ) だったりスタックセグメント( ローカル ) だったりします。
また、インスタンスごとにメンバ関数の中身が異なる訳ではないので、インスタンスごとにメンバ関数のアドレスを保持しているわけでもないと思います。コンパイル時にコンパイラが「メソッド呼び出し」を「適切なアドレスの Call 」に変換しているのでしょう。(このへんはちょっと自信なし)
ありがとうございます。
クラスというのはあくまで抽象的なもので
実態はコンパイラが生成するというところ
なんでしょうか?
C++が今ひとつ使いにくいのは、この辺
なんですよね。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
10個の実数に対する降順ソート...
-
データの値の近いものをグルー...
-
途中経過も表示するプログラム
-
C言語でのLinuxとwindows共通の...
-
TCP/IP通信の送信データについて
-
エクセルシート名の制限を変更...
-
PerlのCGIで全角スペースを入れて
-
CGIについてです。教えて下さい...
-
ピクセル,dpiから容量(バイト...
-
10Mバイトて文字数に すると何...
-
ワイド文字のバイト数が取得で...
-
chompの使い方
-
UCS-2の一覧表が欲しい
-
VBAでUnicodeしか存在しない文...
-
segmentation fault
-
char str[256]の256の意味は?
-
半角、全角の判別方法
-
VAX浮動小数点形式
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
pythonでDBのカラム名で取得し...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
linuxのシェルでファイル名に先...
-
C言語の構造体にてバブルソート...
-
c言語での wavファイルの編集(...
-
'dataType' 引数を Null にする...
-
H8/36064を使ったシリアル通信...
-
オセロゲーム 2次元配列で困...
-
10個の実数に対する降順ソート...
-
c言語の多次元配列で1から100ま...
-
c言語 配列から数字だけをint型...
-
matlabのソースコードをpython...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
おすすめ情報