如何在C / C ++项目中获取所有数据类型大小和函数堆栈占用空间大小?
我有一个很大的继承的C / C ++项目。是否有任何好的工具或者技术来生成有关所有数据类型的" sizeof"报告,以及此类项目中每个功能的堆栈占用量的细分。
解决方案
我不知道任何工具,但是如果我们在MSVC下工作,则可以使用DIA SDK从.PDB文件中提取大小信息。可悲的是,这不适用于I足迹的堆栈。
我不确定现代编译器是否确实存在堆栈占用空间的概念。也就是说,我认为确定使用的堆栈空间量取决于所采用的分支,而分支又取决于输入参数,并且通常需要解决暂停问题。
我很好奇我们为什么要这么做,但这只是出于好奇。
为每个使用的类确定sizeof应该很简单,除非已对其进行了模板化,在这种情况下,我们还必须检查每个实例化。
同样,确定函数的每次调用sizeof很简单:这是每个传递的参数的sizeof加上一些函数开销。
要确定整个程序的全部内存使用情况(如果不是全部都是静态定义的),则需要运行时事件探查器才能完成。
编写将所有类名称收集到一个文件中的shell脚本非常简单。该文件可以构造为.cpp文件,该文件是每个类对sizeof的一系列调用。如果文件还包含每个头文件,则可以编译并运行该文件以获取类的内存占用量的输出。
同样,挑选所有函数定义以查看它们何时不使用引用或者指针参数(即,将整个类实例复制到堆栈中)应该很简单。
所有这一切都说明我不知道现有的工具,但是编写一个工具应该并不困难。
我正在寻找有关函数堆栈占用空间的相同信息,而且我不相信沃伦所说的是正确的。是的,影响函数堆栈的部分因素是参数,但是我还发现,函数中的每个局部变量(无论该变量的作用域如何)都用于确定要为函数保留的堆栈空间量功能。
在我正在使用的特别糟糕的代码示例中,有200多个本地类实例,每个实例都由if(blah-blah)子句保护,但是保留的堆栈空间由这些受保护的局部变量修改。
我知道我所需要的是能够读取每种方法的函数序言,以确定为该函数保留的空间量,现在我该怎么办....?