ページ 1 / 1
classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 15:34
by みどり
以下のような3種類のclassを定義して、sizeof(CLASS)で測りましたがまったく同じでした。
同じ複数のメンバー変数を持っていますが
CLASS1はメンバー関数を持ち、class定義の中に関数のコードを入れる。
CLASS2はメンバー関数を持ち、メンバー関数をclass定義の中に宣言だけ、コードは別のファイルで組む。
CLASS3はメンバー関数を持たない。
これは関数コード保存領域はとデータ保存領域とは必ず別別の処に分けられているという意味でしょうか。
class単位でメモリが分配されるのではないですね?
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 15:48
by h2so5
sizeofが返すのはクラスのサイズではなくてクラスのインスタンスのサイズです。
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 17:41
by みどり
お返答ありがとうございます。
>クラスのインスタンスのサイズ
CLASSがメモリに展開・確保されたサイズでしょうか。
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 18:23
by h2so5
C++のクラスはオブジェクトではありませんから、サイズという概念はありません。
メンバ関数はインスタンスではなくてクラスに属していますから、メンバー関数を増やしてもインスタンスのサイズには影響しません。
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 19:20
by niz
横槍すみません。質問を二点程。
1°
インスタンスという言葉の意味がイマイチよく分かっていないのですが、生成されたオブジェクトの実体で合っていますか?
その場合、みどりさんが仰っているようにインスタンスのサイズとはメモリ上に展開されたサイズですよね?
2°
クラスもある種データ型ですからサイズ自体は存在するのではないでしょうか?
その場合、クラスのサイズとは保有するメンバ変数で変わるのですか?
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 20:14
by h2so5
niz さんが書きました:
1°
インスタンスという言葉の意味がイマイチよく分かっていないのですが、生成されたオブジェクトの実体で合っていますか?
合っています。
niz さんが書きました:
その場合、みどりさんが仰っているようにインスタンスのサイズとはメモリ上に展開されたサイズですよね?
インスタンス化のことを「展開」と表現しているのならばそうです。
niz さんが書きました:
2°
クラスもある種データ型ですからサイズ自体は存在するのではないでしょうか?
その場合、クラスのサイズとは保有するメンバ変数で変わるのですか?
その場合の「クラスのサイズ」の定義は何でしょうか?
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 20:30
by niz
h2so5 さんが書きました:その場合の「クラスのサイズ」の定義は何でしょうか?
例えば一般にint型が4バイトを持っているようにクラスも何バイトか保有しているのではないかと思ったのですが…σ^_^;
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 21:24
by h2so5
niz さんが書きました:
例えば一般にint型が4バイトを持っているようにクラスも何バイトか保有しているのではないかと思ったのですが…σ^_^;
言語によってはありますが、C++ではそのようなことはありません。
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 21:58
by niz
あ、やっと理解しました。
確かにclass自体にサイズはありませんね…
インスタンスになって初めてサイズを持つのは当たり前でしたσ^_^;
変に誤解していたようです。
ありがとうございました!
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 22:16
by みどり
皆さん
レスポンスありがとうございます。
>インスタンス化のことを「展開」と表現しているのならばそうです。
逆に、"インスタンス化"という言葉の内包はここで「メモリ上に展開」以外、ありえないでは?
どうでしょう。
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 23:13
by みどり
CLASSはメンバー変数とメンバー関数より構成されると思います。
そのため「インスタンス」もメンバー変数とメンバー関数が含まれるはずですが、
sizeofで測れるのはもメンバー変数の合計byte数だけでしょうか?
メンバー関数のcodeサイズはどう測りますか。
これに関連して、例えば某CLASSのobjectを複製しようとしたら、
複製先のmemoryサイズをどれ位用意しなければならないでしょうか?
またどうぞ宜しくお願い致します。
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 23:29
by h2so5
みどり さんが書きました:
逆に、"インスタンス化"という言葉の内包はここで「メモリ上に展開」以外、ありえないでは?
「メモリ上に展開」というのは一般的にはハードディスクなどからデータをメモリ空間にロードすることを指します。
インスタンス化のことを言っているとは思いませんでした。
みどり さんが書きました:CLASSはメンバー変数とメンバー関数より構成されると思います。
そのため「インスタンス」もメンバー変数とメンバー関数が含まれるはずですが、
sizeofで測れるのはもメンバー変数の合計byte数だけでしょうか?
インスタンスの記憶域にメンバー関数は含まれません。
また、sizeofはアラインメントや仮想関数テーブルも考慮するので単純にメンバー変数の合計になるわけではありません。
みどり さんが書きました:
メンバー関数のcodeサイズはどう測りますか。
C++レベルで取得する方法はありません。
出力されたバイナリを見ればわからないこともないですが、関数がインライン化される場合もあるので単純に測る方法はありません。
みどり さんが書きました:
これに関連して、例えば某CLASSのobjectを複製しようとしたら、
複製先のmemoryサイズをどれ位用意しなければならないでしょうか?
sizeof(CLASS)
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月09日(火) 23:53
by softya(ソフト屋)
横合いから失礼します。
みどりさんは、メンバ関数にも書き換え可能なメモリ=インスタンスが必要と思われているように感じましたが如何でしょうか?
でもよく考えてみてください。メンバ関数は動的には変化しませんので、インスタンス毎の違いは必要ないです。
そのため、インスタンスごとにメンバ関数のコピーやらメンバ関数のポインタ変数を生成する必要性はありません。
どのインスタンスを利用しているかはthisポインタが受け持ちますので、これをメンバ関数は参照しています。
Re: classメンバーメソッドのcode存在場所?
Posted: 2014年12月10日(水) 13:54
by みどり
良く分かりました!
温かいご指導にいつも感謝の気持ちいっぱいです。