• ベストアンサー

VCでクラスのメモリ配置の解析

昔どこかのサイトで、クラスのメンバのメモリ配置を出力させていたのを見たことがあるのですが、VCでも同じことができますか? メンバ関数や仮想関数やテンプレートがどう配置されるのかを知りたいのです。クラスのサイズとメンバのアドレスを出力させてもいいのでしょうが、継承していたりすると結構面倒なので、出来ればコンパイラに吐かせたいです。 回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

お望みの事は多分、以下の方法で出来るハズ。。。 「プロジェクト」→「~のプロパティ」→「構成プロパティ」→「リンカ」 →「デバッグ」→「マップ ファイルの生成」を(はい)に変更し、マップファイル名を指定。 これでマップファイルが生成されます。 ただ、見た限りクラスのサイズは分からなさそう。 ちなみに、なぜリンカのオプションなのかというと、関数をどのアドレスに配置するか決めるのはリンカのため。。 マップファイルの見方は、GOOGLEで「visual studio マップファイル 見方」で検索すると、3番目位に出てきました。

参考URL:
http://nga78n.hp.infoseek.co.jp/whisper2.htm
noname#113783
質問者

お礼

できました! マップファイルって言うんですね。 回答ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • templateクラスの宣言と定義を、別々のファイルに分けたい

    こんばんは。 templateを利用したクラスについての質問です。 通常、テンプレートクラスのメンバ関数は、その定義部分をインライン展開するべき、とのことですが… なんとかして宣言部と定義部を別々のファイルに分ける事は出来ないでしょうか? テンプレート変数をクラス内で共有したいため、テンプレート関数ではなく、テンプレートクラスで上記の事を実現したいのです。 「コンパイラによっては、インライン関数でなければならない」という記述を見かけたので、 コンパイラによってはインライン関数でなくても構わないのでしょうか? 開発環境は WindowsXP-SP2 VisualStudio2005-SP1 C++コンソールアプリケーションです。

  • メンバ関数テンプレートの仮想関数。

    VC8.0言語処理系でメンバ関数テンプレートを仮想関数にしたらエラーになりました。 これは、VC8.0言語処理系の対応なのでしょうか? それともC++言語系の仕様なのでしょうか? 今回、メンバ関数の一部にイテレータを使用していまして、その関係で一部の関数がテンプレートになっています。 そして、基底クラスでは実装せず、派生先で実装を強制する純粋仮想関数としたのですが、この処理がコンパイルエラーとなっています。 メンバ関数の参照などを考えたのですが、どうも巧くコンパイルでき無そうです。 この処理が出来ないことは設計段階で把握していなかったので、これが出来ないとすると設計のし直し(テンプレートの廃止など)をしなくてはいけません。 詳しい方がいらっしゃいましたら、お願いします。

  • 基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

    VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

  • (VC++.Net) クラスにクラスを属性として追加できるでしょうか?

    初歩的な質問ですみませんが、教えてください。 #include <string> class A { int x; int y; std::string strX; //↑stringクラスを使いたい。 //(charだったり上手くいく。) }; とやると実行自体(コンパイラーエラーがたくさんでますが・・)は出来るのですが、アクションを掛けたら、"ハンドルしていない例外が発生しました"というエラーが出てしまいます。(←あたりまえか) stringクラスに限ったことではないのですが、自作のクラスを、ほかの自作のクラスへメンバ変数?的に使用したいのですが、上手くできません。一つ二つのクラスを、ほかのクラスで使用するならば、継承すればよいのですが、一つのクラスが、たくさんのクラスを使用するような場合、どのように記述すればよいのでしょうか? どこを勉強すればよいのでしょうか? ご教授のほど、よろしくお願いいたします。m( _ _ )m

  • クラスが認識されていない(VC++)

    WinXP、VC++6.0のMFCでダイアログベースです。 クラスRedとクラスBlueを作ったとします。 クラスAメンバにクラスBのオブジェクトを入れたとします。 /*******Red.hファイル*********/ #include"Blue.h" class Red{ Blue obj_blue; void FuncRed(); }; /*******Blue.hファイル*********/ class Blue{ void FuncBlue(); }; ここまでは良いのですが、 クラスRedのメンバ関数FuncRed()の中でobj_blueを使うと 「左側がクラス、構造体、共用体ではありません。」 というエラーがでます。 ただし、FuncRed()の中でクラスBlueのオブジェクトobj_blue2を作って使うとエラーが出ずに使えます。 この現象で悩んでいます。何でも良いですのでお願いします。 情報不足であれば補足します。

  • メッセージボックスクラスみたいなものはありますか

    JAVA初心者です。 VBでのMsgBox、VCでのMessageBox関数みたいな、お手軽なクラスは用意されていないのでしょうか? やはり、参考書等にある様にJDialogクラスから継承させて地道に作成するしかないのでしょうか?

    • ベストアンサー
    • Java
  • 抽象クラスについて

    抽象クラスを使って派生クラスを作成していて疑問になったのですが、派生クラスで作るメンバ関数は、抽象クラスで仮想関数としてすべて定義しておくべきなのでしょうか。ご教授願います。

  • クラスについて

    環境 WIN2000 VC++6.0 MFC にて あるクラス(CShellListCtrlEx)内部に別のクラス(CCharEditEx)を作成することなんて可能なんでしょうか?。 ある程度は、できそうな気がするのですが・・・。 どうしても、仮想関数やWindowsメッセージハンドラが使えないで困っています。 どなたかご存知でしたら、ご教授お願いします。

  • 仮想メモリの制御

    VC++を使って、 2次配列[1000][640×480]を(FPS30) リングバッファで書き込み、書き出しし、 ディスプレイに出力したいのですが、 当然メモリが足りず、仮想メモリを使用し、さらにFPS30 を大幅に下回ってしまいます。 配列のサイズを小さくすることも可能ですが、 なるべく上記の条件に近い方が望ましいです。 そこで書き込みしたての値を一時あえて仮想メモリに 保存し、必要になる手前で引き出して物理メモリ上に 置いておくといったプログラムを書いてみようかと思うのですが、 実現可能でしょうか? もしくはよりよい対策あればお教えいただけますでしょうか? 当方、知識不足で仮想メモリを制御できるのかどうかも把握しておりません。

  • クラスの分割

    画像処理のプログラムを書いているのですが、1つのクラスに必要な変数と関数をぶち込んだため、変数20~、関数20~、2000行くらいのクラスになっています。 このままでは見辛いので、クラスを処理ごとに分割して見易くしたいのですが、各関数でいくつか共通の変数を使用しているため上手く分割ができなくて困っています。 データのみのクラスを継承した子クラスを3つ作ってみたらインスタンスが3つできてしまい意味がありませんでした。 ↓の図に示すようなクラスを作りたいのですが、いくつか質問をさせてください       共通データクラス     /    |    \   子クラスA 子クラスB 子クラスC 1、変数20~、関数20~、2000行くらいのクラスは普通でしょうか?(分割する必要がありますか?) 2、↑の図はクラスの作り方として問題がありますか? 3、2で問題がない場合実現する方法として、仮想継承、関数に共通データのポインタを渡す以外に方法があるかどうか まだまだC++を勉強中で、便利な構造体程度にしか使えていませんが、どなたかご教授お願いします。

このQ&Aのポイント
  • ファックスメール転送が出来なくなった。昨年までパソコンにメールで転送されていたが、現在は不可能。
  • NTT回線からソフトバンク回線に変更した後、複合機のインターネット接続エラー03が表示される。
  • 質問者の環境はWindows10で無線LAN接続し、ひかり回線を使用している。
回答を見る