Как определить размер COM-объекта в памяти? - PullRequest
0 голосов
/ 26 января 2012

У меня есть интерфейс 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 ]

1 голос
/ 26 января 2012

Это размер экземпляра вы ищете или общий объем памяти объекта?Очень важно понять это различие.

Если экземпляр содержит указатель на динамическую память, то это всего 4–8 байтов данных экземпляра, но указанный блок памяти может быть как угодно большим.И, как говорили другие, надежного способа узнать тоже нет.Размер экземпляра может запутать мой маршалинг.Отпечаток памяти может быть запутан частными кучами, разделением памяти и тому подобным.

Сам COM не предоставляет никакого механизма для этого.C ++ также не работает - COM-сервер, о котором вы говорите, может даже не быть написан на C ++ (хотя в случае MSXML, вероятно, так и есть).

Для конкретной версии и сборки библиотеки MSXMLСервер символов Microsoft может предоставить некоторую информацию о деталях реализации;например, он может дать вам размер экземпляра.Тем не менее, это не масштабируется для производства - вы действительно хотите отправить домашний отладчик, который загружает символы для MSXML и анализирует их на компьютере пользователя?

Что касается занимаемой памяти, то обработайте снимки использования памятиВы - ваш друг, и даже те должны быть взяты с зерном соли размера чего-то очень большого.

1 голос
/ 26 января 2012

COM не предоставляет способ узнать размер объекта.В некотором смысле это не может - если объект находится в другом процессе, вы хотите знать размер заглушки в вашем процессе или размер фактического объекта в другом процессе?

Вы можете приблизитьэто путем создания большого количества экземпляров и использования мониторинга памяти, чтобы увидеть, как это изменяет общий объем памяти приложения.

0 голосов
/ 26 января 2012

Я не уверен, что вы можете определить точный размер 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:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...