1

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

4

4 回答 4

1

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

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

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

要确定整个程序的全部内存使用情况,如果不是全部都是静态定义的,那么没有运行时分析器就无法完成。

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

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

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

于 2008-09-30T18:05:27.560 回答
0

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

于 2008-09-18T14:28:46.577 回答
0

我不知道有任何工具,但如果您在 MSVC 下工作,您可以使用DIA SDK从 .PDB 文件中提取大小信息。可悲的是,这不适用于堆栈足迹 IIRC。

于 2008-09-18T13:01:57.737 回答
0

我正在寻找有关函数堆栈占用空间的相同信息,但我不相信沃伦所说的是真的。是的,影响函数中堆栈的部分原因是参数,但我还发现函数中的每个局部变量,无论所述变量的范围如何,都用于确定为功能。

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

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

于 2009-09-11T14:03:36.043 回答