如何确定内存中的COM对象大小?

时间:2012-01-26 16:29:25

标签: c++ com

我有MSXML2 :: IXMLDOMNodeList接口。 我可以使用这样的代码从这个列表中找到所有MSXML2 :: IXMLDOMNode-s的公共长度:

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 ++中实现它?

3 个答案:

答案 0 :(得分:1)

COM没有提供了解对象大小的方法。在某种程度上它不能 - 如果对象在另一个进程中,你想知道进程中存根的大小或另一个进程中实际对象的大小吗?

您可以通过创建大量实例并使用内存监控来查看它是如何更改整个应用程序内存占用量的。

答案 1 :(得分:1)

您正在使用实例大小,还是对象的总内存占用量?了解这种区别非常重要。

如果实例包含指向动态内存的指针,那么实例数据只有4到8个字节,但指向的内存块可能与任何内容一样大。和其他人一样,也没有可靠的方法可以了解。实例大小可能会混乱我的编组。存储器foorprint可能被私人堆,内存共享等混淆。

COM本身没有提供任何机制。 C ++也没有 - 您正在谈论的COM服务器甚至可能不是用C ++编写的(尽管在MSXML的情况下,它可能是)。

对于特定版本和MSXML库的构建,Microsoft符号服务器可以提供对实现细节的一些了解;例如,它可能会为您提供实例大小。但是,这不能扩展到生产阶段 - 你真的想发布一个自制的调试器来下载MSXML的符号并在用户的机器上解析它们吗?

至于内存占用,那么进程内存消耗快照是你的朋友,甚至那些应该采用一些非常大的盐大小。

答案 2 :(得分: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

Microsoft提供了一些API来确定程序的内存状态。以下是将上述技术应用于Microsoft API的方法:

_CrtMemState m1;
_CrtMemCheckpoint( &m1 );

 //COM object creation

_CrtMemState m2;
_CrtMemCheckpoint( &m2 );

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

对象difference告诉COM对象的大小。您可以将其值打印为:

_CrtMemDumpStatistics( &difference );

或者,您可以进一步分析定义为difference类型的对象_CrtMemState

//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;

阅读MSDN上的文档: