Как получить все размеры типов данных и размеры стека функций в проекте C / C ++? - PullRequest
1 голос
/ 18 сентября 2008

У меня большой унаследованный проект C / C ++. Существуют ли какие-либо хорошие инструменты или методы для создания отчета о «sizeof» всех типов данных и разбивки стековых следов каждой функции в таком проекте.

Ответы [ 4 ]

1 голос
/ 30 сентября 2008

Мне любопытно узнать, почему вы хотите это сделать, но это просто любопытство.

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

Аналогично, определение для вызова sizeof для функции очень просто: это sizeof для каждого переданного параметра плюс некоторые служебные расходы.

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

Написание сценария оболочки, который бы собирал все имена классов в файл, было бы довольно просто. Этот файл может быть сконструирован как файл .cpp, представляющий собой серию вызовов sizeof для каждого класса. Если этот файл также # включает каждый заголовочный файл, он может быть скомпилирован и запущен для получения вывода из памяти только классов.

Аналогично, отбраковка всех определений функций для определения, когда они не используют аргументы ссылки или указателя (т.е. копирование всего экземпляра класса в стек), должна быть довольно простой.

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

0 голосов
/ 11 сентября 2009

Я ищу ту же информацию об объеме стека для функций, и я не верю, что то, что сказал Уоррен, является правдой. Да, часть того, что влияет на стек в функции, это параметры, но я также обнаружил, что каждая локальная переменная в функции, независимо от области видимости указанной переменной, используется для определения количества стекового пространства, которое нужно зарезервировать для функция.

В конкретном примере плохого кода, с которым я работаю, существует> 200 экземпляров локальных классов, каждый из которых защищен предложениями if (бла-бла), но зарезервированное пространство стека изменяется этими защищенными локальными переменными.

Я знаю, что мне нужно, чтобы иметь возможность прочитать пролог функции для каждого метода, чтобы определить количество места, зарезервированного для функции, теперь, как бы я это сделал ....?

0 голосов
/ 18 сентября 2008

Я не уверен, существует ли концепция стека в современных компиляторах. То есть, я думаю, что определение объема используемого стекового пространства зависит от выбранных ветвей, что, в свою очередь, зависит от входных параметров и в целом требует решения проблемы остановки.

0 голосов
/ 18 сентября 2008

Мне не известны какие-либо инструменты, но если вы работаете в MSVC, вы можете использовать DIA SDK для извлечения информации о размере из файлов .PDB. К сожалению, это не будет работать для стековых следов IIRC.

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