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