2012-01-26 6 views
0

私はMSXML2 :: IXMLDOMNodeListインターフェイスを持っています。 私はそのようなコードを使用して、このリストからすべてのMSXML2 :: IXMLDOMNode-Sの共通の長さを見つけることができます。メモリ内のCOMオブジェクトサイズを調べる方法は?

MSXML2::IXMLDOMNode* pDOMXMLNode = 0; 
BSTR NodeText; 
ULONG lValueSize = 0; 
ULONG lCommonLength = 0; 
while(pDOMXmlNodeList->nextNode(&pDOMXMLNode)== S_OK) 
{  
pDOMXMLNode->get_xml(&NodeText);  
CString strNode(NodeText); 
lValueSize += strNode.GetLength();  
}  
lCommonLength += lValueSize; 

それは良いですが、それは私が検索したいものではありません:私は、オブジェクトのインスタンスのサイズを決定したいですメモリ内にある。 C++で作成する方法はありますか?

答えて

0

COMオブジェクトの正確なサイズを判断できるかどうかはわかりません。ただし、COMオブジェクトのおおよそのサイズを決定するために、次のトリックを使用できます。

//First determine how much memory your program is currently using. 
//Say it is currently `m1` 

//allocate COM object 

//Now again, determine how much memory your program is using 
//Say it is m2 

//COM object size = m2 - m1 

マイクロソフトでは、プログラムのメモリ状態を判断するためのAPIを提供しています。ここでは、マイクロソフトのAPIに上記の技術を適用する方法である:

_CrtMemState m1; 
_CrtMemCheckpoint(&m1); 

//COM object creation 

_CrtMemState m2; 
_CrtMemCheckpoint(&m2); 

_CrtMemState difference; 
_CrtMemDifference(&difference, &m1,&m2); 

オブジェクトdifferenceは、COMオブジェクトのサイズを伝えます。

  • :MSDNのドキュメントを読んで

    //crtdbg.h 
    
    struct _CrtMemBlockHeader; 
    typedef struct _CrtMemState 
    { 
        struct _CrtMemBlockHeader * pBlockHeader; 
        size_t lCounts[_MAX_BLOCKS]; 
        size_t lSizes[_MAX_BLOCKS]; 
        size_t lHighWaterCount; 
        size_t lTotalCount; 
    } _CrtMemState; 
    

    :あなたはさらにとして定義された型_CrtMemStateであるオブジェクトdifferenceを分析することができ、

    _CrtMemDumpStatistics(&difference); 
    

    または:あなたは、としてその値を印刷することができますMemory State Comparison

1

COMは、オブジェクトのサイズを知る方法を提供しません。つまり、オブジェクトが別のプロセスにある場合、プロセス内のスタブのサイズや、他のプロセス内の実際のオブジェクトのサイズを知りたいのですか?

多数のインスタンスを作成し、メモリー監視を使用してアプリケーション全体のメモリー占有量をどのように変更するかを見てみると、これを近似できます。

1

インスタンスサイズ、またはオブジェクトの合計メモリフットプリントですか?この区別を理解することはかなり重要です。

インスタンスにダイナミックメモリへのポインタが含まれている場合、それはインスタンスデータの4〜8バイトだけですが、指定されたメモリブロックはどれも大きなものになる可能性があります。他の人が言ったように、どちらかを知る信頼できる方法はありません。インスタンスのサイズはマーシャリングを混乱させる可能性があります。メモリ不足はプライベートヒープ、メモリ共有などで混乱する可能性があります。

COM自体にはそのメカニズムはありません。 C++はどちらも - あなたが話しているCOMサーバはC++で書かれていないかもしれません(MSXMLの場合はおそらくそうです)。

MSXMLライブラリの特定のバージョンとビルドについては、Microsoftのシンボルサーバーによって実装の詳細がわかります。たとえば、インスタンスサイズを与えるかもしれません。ただし、これは生産には適用されません。MSXML用のシンボルをダウンロードしてユーザーのマシンで解析する手作りのデバッガを実際に出荷したいのですか?

メモリフットプリントに関しては、プロセスメモリの消費量のスナップショットはあなたの友人であり、塩の粒度が非常に大きいものであってもそれらを使用する必要があります。

関連する問題