如何在C / C ++项目中获取所有数据类型大小和函数堆栈占用空间大小?

时间:2008-09-18 11:52:31

标签: c++ c data-structures size

我有一个大型的继承C / C ++项目。是否有任何好的工具或技术来生成所有数据类型的“sizeof”报告,以及此类项目中每个函数的堆栈覆盖的细分。

4 个答案:

答案 0 :(得分:1)

我很想知道你为什么要这样做,但这只是一种好奇心。

确定每个使用的类的sizeof应该很简单,除非它们是模板化的,在这种情况下你也必须检查每个实例。

同样,确定函数的每次调用 sizeof很简单:它是每个传递参数的sizeof加上一些函数开销。

要确定整个程序的完整内存使用量,如果没有全部静态定义,则在没有运行时分析器的情况下无法完成。

编写一个将所有类名收集到文件中的shell脚本非常简单。该文件可以构造为.cpp文件,该文件是对每个类的一系列sizeof调用。如果文件也包含#included每个头文件,则可以编译并运行它以获得仅仅类的内存占用量的输出。

同样,剔除所有函数定义以查看它们何时不使用引用或指针参数(即将整个类实例复制到堆栈中)应该非常简单。

所有这一切都说我知道没有现有的工具,但写一个应该不难。

答案 1 :(得分:0)

我不知道任何工具,但如果你在MSVC下工作,你可以使用DIA SDK从.PDB文件中提取大小信息。遗憾的是,这不适用于堆叠脚印IIRC。

答案 2 :(得分:0)

我不确定 堆栈覆盖区的概念是否真的存在于现代编译器中。也就是说,我认为确定所使用的堆栈空间量取决于所采用的分支,而分支又取决于输入参数,并且通常需要解决暂停问题。

答案 3 :(得分:0)

我正在寻找关于功能的堆栈足迹的相同信息,我不相信沃伦所说的是真的。是的,影响函数堆栈的部分因素是参数,但我还发现函数中的每个局部变量,无论所述变量的作用域是什么,都用于确定要为其保留的堆栈空间量。功能

在我正在使用的特定的糟糕代码示例中,有> 200个本地类实例,每个实例都由if(blah-blah)子句保护,但保留的堆栈空间由这些受保护的局部变量修改。

我知道我需要的是能够读取每个方法的函数序言以确定为函数保留的空间量,现在我该怎么做....?