2009-08-13 28 views
6

私はQtとC++を使用しています。特定のQtクラスのインスタンスが使用するメモリ量を調べる必要があります。これは通常sizeofを使用して行われますが、Qtでは各クラスにポインタ実際の実装を含む別のクラスには、このプライベートな実装クラスの定義はヘッダーではなく、ソースコードでのみ見つかります。Qtオブジェクトのサイズを取得する

私はQtが新しくなっていますので、これを解決するためのアイデアがない場合は、標準的な方法がありますか?

+6

なぜあなたはこれを行う必要があると思いますか? –

+1

私は何千ものそれを作ることができるか、オブジェクトが大きすぎるかどうかを知る必要があります。 –

+3

@Diaa:それらを作成し、エラーを正しくチェックしてください。 –

答えて

7

同じタイプの異なるオブジェクトに割り当てられるメモリ量が同じではない可能性があるため、正確な答えはありません(QSomething Aはキャッシュからデータを再利用できるかもしれませんがQSomething Bは別々に割り当てるなど)。

あなたができることは、起動し、問題のオブジェクトのNを割り当ててから、長い時間sleep()に行く簡単なテストプログラムを書いていると思います。プログラムがスリープしている間に、プロセスが使用しているRAMの量を確認するには、Task Manager(または好きなツール)を使用します。その後、プロセスをCtrl + C(またはkill)し、Nの値を大きくして再度実行し、測定を繰り返します。そのプロセスを繰り返し、最終的には、割り当てられたアイテムの数でプロセスのRAM割り当てがどのように増加するのかを知ることができます。オブジェクトごとの平均メモリコストの目安を得るために少しの代数を行うことができます。

(プロセスを開始するだけでメモリオーバーヘッドがあるので、すべてのケースからN = 0の場合に使用されるメモリを減算することで、オブジェクトのコストを測定することができます。環境上のオーバーヘッド)

10

標準C++でこれを行う方法はなく、そのようなものをサポートするフレームワークはほとんどありません。理由はかなり単純です - あなたが観察したように、オブジェクトにはポインタが含まれている可能性があり、それらのポインタはポインタを含むさらなるオブジェクト、 などを指している可能性があります。ポインタチェーンの終わりに達しても、ポインタが指すメモリの量を調べる一般的な方法はありません。

だから、問題を解決する別の方法を見つける必要があります。私は最初に解決するのが正しい問題ではないと思います。

5

問題はQtに固有の問題ではありません。 std::stringがどれだけのスペースを使用するかを考慮してください。 sizeof(std::string)でもstd::string::size()でもありません。

質問はほとんど意味がないので、この質問に対する回答はありません。

+2

std :: stringの場合、sizeof(std :: string)+ stringの長さを使用すると、ほぼ正しい数になります。 オブジェクトが効率的なアプリケーションを書くことがどれほど重くなっているかを示す必要があります。 このような質問は、低レベルのプログラミングを可能にし、絶対的な制御を可能にする言語ではほとんど意味をなさないことがわかりました。 –

+1

小さな文字列の最適化、サイズの丸め、ヒープオーバーヘッド、COWという、それほど信頼できない理由をいくつか挙げておきます。あなたの2番目の発言で、私はこの情報の欠如が私を妨げている状況にまだ遭遇していない。 – MSalters

+0

@Diaaそれはあなたに絶対的な制御を与えますが、それを望むなら、あなたはQtや実際に標準ライブラリのようなライブラリを使うことができません - 自分で書く必要があります。しかし、これらの図書館のいずれにもあなたの質問が尋ねる機能を提供していないという事実は、実装するのに特に有用な機能ではないことを示唆するはずです。 –

3

一般的に、QObjectは数千ものインスタンスを作成するにはかなり重いことがわかりました。

他にもいくつかの人が言及しているように、これを試してみると、何が起こるのかを見るのが最も良い方法です。

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QObject objects[5000]; 
    return app.exec(); 
} 

次に、アプリケーションを終了する前にメモリ使用量を測定します。

関連する問題