Как я могу статистику номеров экземпляров каждого класса и памяти, которую они использовали в пиковое время в собственном проекте C ++ - PullRequest
1 голос
/ 09 августа 2011

Мой проект компилятора серьезно потребляет память. Поэтому я хочу найти метод, который может определить, какой класс является худшим. Это должно дать мне что-то вроде ниже:

--------------------------------------------------------------------
Class name, Instance count, Peak memory consumed

Circle, 223, 2230 k

Rectangle, 124, 3220 k

Line, 22322, 222322 k

....., ...,   .... .

Я долго искал в Интернете, но пока ничего не получилось. (

Я пробовал инструменты Devpartner. Это не может иметь дело с родным C ++, как я знаю. Это из-за того, что я не знаю, как его использовать?

Есть ли у вас какие-либо предложения?

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

Вы можете использовать детектор утечки памяти или сборщик мусора.Лично я использую Boehm GC в качестве сборщика мусора, но его можно использовать как детектор утечки.Мой друг использует valgrind для обнаружения утечек памяти.

Также возможно извлечь все ваши классы из пользовательского объекта, который отслеживает ВСЕ выделенные объекты в статической структуре std :: set;конструктор вставляет «this» в эту структуру, деструктор удаляет ее.Затем вы можете использовать статический Object :: detectMemoryLeaks () в конце вашей программы, чтобы распечатать все протекающие объекты и их typeid (ptr) .name ().

Редактировать:

Iвнедрил мою версию за последние несколько часов в мою библиотеку.Не нашел еще способа исключить статические переменные или автоматически определить размер полиморфного объекта.Также прошу прощения за java-подобный инопланетный код и наличие сборки мусора: header и реализаций .Найдите конструктор, деструктор, статический атрибут aliveObjects и статический метод listAliveObjects.Вы можете легко понять суть концепции.

Пример выходных данных:

Frigo::Lang::Array<char> : 6 objects
Frigo::Lang::String : 6 objects
Frigo::Lang::Boolean : 2 objects
Frigo::Lang::Integer : 2 objects
Frigo::Math::Infinity : 1 objects
Frigo::Lang::Class : 1 objects

----

Frigo::Lang::Array<char> : 7 objects @ 0x1d33e18, 0x1d33e78, 0x1d33ed8, 0x1d33f38, 0x1d33f68, 0x1d33f98, 0x1d33fc8
Frigo::Lang::String : 7 objects @ 0x1d33e10, 0x1d33e70, 0x1d33ed0, 0x1d33f30, 0x1d33f60, 0x1d33f90, 0x1d33fc0
Frigo::Lang::Boolean : 2 objects @ 0x1d30fa8, 0x1d30fd8
Frigo::Lang::Integer : 2 objects @ 0x1d30e88, 0x1d30eb8
Frigo::Lang::Class : 1 objects @ 0x1d30f60
Frigo::Math::Infinity : 1 objects @ 0x41a110

----

Frigo::Lang::Array<char> : 6 objects
    Frigo::Lang::Array<char>@3b3e78
    Frigo::Lang::Array<char>@3b3ed8
    Frigo::Lang::Array<char>@3b3f38
    Frigo::Lang::Array<char>@3b3f68
    Frigo::Lang::Array<char>@3b3f98
    Frigo::Lang::Array<char>@3b3fc8
Frigo::Lang::String : 6 objects
    Frigo::Lang::Boolean
    Frigo::Lang::Class
    Frigo::Lang::Integer
    Hello World!
    true
    false
Frigo::Lang::Boolean : 2 objects
    true
    false
Frigo::Lang::Integer : 2 objects
    987
    123
Frigo::Math::Infinity : 1 objects
    Frigo::Math::Infinity@41a110
Frigo::Lang::Class : 1 objects
    Frigo::Lang::Class@3b0f60

----

Frigo::Lang::Array<char> : 7 objects
    @ 0x1cd3e18 : Frigo::Lang::Array<char>@1cd3e18
    @ 0x1cd3e78 : Frigo::Lang::Array<char>@1cd3e78
    @ 0x1cd3ed8 : Frigo::Lang::Array<char>@1cd3ed8
    @ 0x1cd3f38 : Frigo::Lang::Array<char>@1cd3f38
    @ 0x1cd3f68 : Frigo::Lang::Array<char>@1cd3f68
    @ 0x1cd3f98 : Frigo::Lang::Array<char>@1cd3f98
    @ 0x1cd3fc8 : Frigo::Lang::Array<char>@1cd3fc8
Frigo::Lang::String : 7 objects
    @ 0x1cd3e10 : Frigo::Lang::Boolean
    @ 0x1cd3e70 : Frigo::Lang::Class
    @ 0x1cd3ed0 : Frigo::Lang::Integer
    @ 0x1cd3f30 : Frigo::Math::Infinity
    @ 0x1cd3f60 : Hello World!
    @ 0x1cd3f90 : true
    @ 0x1cd3fc0 : false
Frigo::Lang::Boolean : 2 objects
    @ 0x1cd0fa8 : true
    @ 0x1cd0fd8 : false
Frigo::Lang::Integer : 2 objects
    @ 0x1cd0e88 : 987
    @ 0x1cd0eb8 : 123
Frigo::Lang::Class : 1 objects
    @ 0x1cd0f60 : Frigo::Lang::Class@1cd0f60
Frigo::Math::Infinity : 1 objects
    @ 0x41b110 : Frigo::Math::Infinity@41b110
0 голосов
/ 10 августа 2011

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

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

0 голосов
/ 09 августа 2011

Конечно, я надеюсь, что вы говорите о динамически распределенной памяти.

Вы должны использовать инструменты профилирования памяти.
Если нет, то вы должны перегрузить операторы new and delete` для своего собственного класса и реализовать механизм подсчета памяти таким же образом.

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