classメンバーメソッドのcode存在場所?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みどり

classメンバーメソッドのcode存在場所?

#1

投稿記事 by みどり » 9年前

以下のような3種類のclassを定義して、sizeof(CLASS)で測りましたがまったく同じでした。
同じ複数のメンバー変数を持っていますが

CLASS1はメンバー関数を持ち、class定義の中に関数のコードを入れる。
CLASS2はメンバー関数を持ち、メンバー関数をclass定義の中に宣言だけ、コードは別のファイルで組む。
CLASS3はメンバー関数を持たない。

これは関数コード保存領域はとデータ保存領域とは必ず別別の処に分けられているという意味でしょうか。
class単位でメモリが分配されるのではないですね?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: classメンバーメソッドのcode存在場所?

#2

投稿記事 by h2so5 » 9年前

sizeofが返すのはクラスのサイズではなくてクラスのインスタンスのサイズです。

みどり

Re: classメンバーメソッドのcode存在場所?

#3

投稿記事 by みどり » 9年前

お返答ありがとうございます。
>クラスのインスタンスのサイズ
CLASSがメモリに展開・確保されたサイズでしょうか。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: classメンバーメソッドのcode存在場所?

#4

投稿記事 by h2so5 » 9年前

C++のクラスはオブジェクトではありませんから、サイズという概念はありません。
メンバ関数はインスタンスではなくてクラスに属していますから、メンバー関数を増やしてもインスタンスのサイズには影響しません。

niz

Re: classメンバーメソッドのcode存在場所?

#5

投稿記事 by niz » 9年前

横槍すみません。質問を二点程。


インスタンスという言葉の意味がイマイチよく分かっていないのですが、生成されたオブジェクトの実体で合っていますか?
その場合、みどりさんが仰っているようにインスタンスのサイズとはメモリ上に展開されたサイズですよね?


クラスもある種データ型ですからサイズ自体は存在するのではないでしょうか?
その場合、クラスのサイズとは保有するメンバ変数で変わるのですか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: classメンバーメソッドのcode存在場所?

#6

投稿記事 by h2so5 » 9年前

niz さんが書きました:
インスタンスという言葉の意味がイマイチよく分かっていないのですが、生成されたオブジェクトの実体で合っていますか?
合っています。
niz さんが書きました: その場合、みどりさんが仰っているようにインスタンスのサイズとはメモリ上に展開されたサイズですよね?
インスタンス化のことを「展開」と表現しているのならばそうです。
niz さんが書きました:
クラスもある種データ型ですからサイズ自体は存在するのではないでしょうか?
その場合、クラスのサイズとは保有するメンバ変数で変わるのですか?
その場合の「クラスのサイズ」の定義は何でしょうか?

niz

Re: classメンバーメソッドのcode存在場所?

#7

投稿記事 by niz » 9年前

h2so5 さんが書きました:その場合の「クラスのサイズ」の定義は何でしょうか?
例えば一般にint型が4バイトを持っているようにクラスも何バイトか保有しているのではないかと思ったのですが…σ^_^;

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: classメンバーメソッドのcode存在場所?

#8

投稿記事 by h2so5 » 9年前

niz さんが書きました: 例えば一般にint型が4バイトを持っているようにクラスも何バイトか保有しているのではないかと思ったのですが…σ^_^;
言語によってはありますが、C++ではそのようなことはありません。

niz

Re: classメンバーメソッドのcode存在場所?

#9

投稿記事 by niz » 9年前

あ、やっと理解しました。
確かにclass自体にサイズはありませんね…
インスタンスになって初めてサイズを持つのは当たり前でしたσ^_^;
変に誤解していたようです。
ありがとうございました!

みどり

Re: classメンバーメソッドのcode存在場所?

#10

投稿記事 by みどり » 9年前

皆さん
レスポンスありがとうございます。

>インスタンス化のことを「展開」と表現しているのならばそうです。

逆に、"インスタンス化"という言葉の内包はここで「メモリ上に展開」以外、ありえないでは?

どうでしょう。

みどり

Re: classメンバーメソッドのcode存在場所?

#11

投稿記事 by みどり » 9年前

CLASSはメンバー変数とメンバー関数より構成されると思います。
そのため「インスタンス」もメンバー変数とメンバー関数が含まれるはずですが、
sizeofで測れるのはもメンバー変数の合計byte数だけでしょうか?

メンバー関数のcodeサイズはどう測りますか。

これに関連して、例えば某CLASSのobjectを複製しようとしたら、
複製先のmemoryサイズをどれ位用意しなければならないでしょうか?


またどうぞ宜しくお願い致します。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: classメンバーメソッドのcode存在場所?

#12

投稿記事 by h2so5 » 9年前

みどり さんが書きました: 逆に、"インスタンス化"という言葉の内包はここで「メモリ上に展開」以外、ありえないでは?
「メモリ上に展開」というのは一般的にはハードディスクなどからデータをメモリ空間にロードすることを指します。
インスタンス化のことを言っているとは思いませんでした。
みどり さんが書きました:CLASSはメンバー変数とメンバー関数より構成されると思います。
そのため「インスタンス」もメンバー変数とメンバー関数が含まれるはずですが、
sizeofで測れるのはもメンバー変数の合計byte数だけでしょうか?
インスタンスの記憶域にメンバー関数は含まれません。
また、sizeofはアラインメントや仮想関数テーブルも考慮するので単純にメンバー変数の合計になるわけではありません。
みどり さんが書きました: メンバー関数のcodeサイズはどう測りますか。
C++レベルで取得する方法はありません。
出力されたバイナリを見ればわからないこともないですが、関数がインライン化される場合もあるので単純に測る方法はありません。
みどり さんが書きました: これに関連して、例えば某CLASSのobjectを複製しようとしたら、
複製先のmemoryサイズをどれ位用意しなければならないでしょうか?
sizeof(CLASS)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: classメンバーメソッドのcode存在場所?

#13

投稿記事 by softya(ソフト屋) » 9年前

横合いから失礼します。
みどりさんは、メンバ関数にも書き換え可能なメモリ=インスタンスが必要と思われているように感じましたが如何でしょうか?
でもよく考えてみてください。メンバ関数は動的には変化しませんので、インスタンス毎の違いは必要ないです。
そのため、インスタンスごとにメンバ関数のコピーやらメンバ関数のポインタ変数を生成する必要性はありません。
どのインスタンスを利用しているかはthisポインタが受け持ちますので、これをメンバ関数は参照しています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

みどり

Re: classメンバーメソッドのcode存在場所?

#14

投稿記事 by みどり » 9年前

良く分かりました!
温かいご指導にいつも感謝の気持ちいっぱいです。

閉鎖

“C言語何でも質問掲示板” へ戻る