【问题标题】:How to get all datatype sizes and function stack footprint sizes in a C/C++ project?如何在 C/C++ 项目中获取所有数据类型大小和函数堆栈占用空间大小?
【发布时间】:2010-09-10 15:33:58
【问题描述】:

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

【问题讨论】:

    标签: c++ c data-structures size


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 嗨,warren,问的原因是我将一个程序 (gnugo) 移植到了一个平台 Symbian/S60,它有一个有限的堆栈大小(实际上是有限的堆大小,但堆栈特别危急)。我现在主要通过在堆上放一些东西来工作,但它仍然会遇到堆栈溢出。
    • 是的,写一个脚本来做这件事当然是后备,但我希望避免这种情况。特别是“一些函数开销”部分实际上是最关键的部分,因为程序中存在递归。我希望有一种方法可以避免编写大部分 C 语言解析器 :)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 它仍然应该可以获得作为离散实体的每个函数的最大占用空间,而不是从该函数可遵循的每个可能代码路径的占用空间。
      【解决方案4】:

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

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

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

      【讨论】:

      • 我没有得到任何好的答案,但我得到的最终结果足以满足我的目的,那就是编写一个函数来测量堆栈深度。然后你需要从每个函数中调用它,但这对我来说已经足够了,因为我有一些地方可以挂上它。代码见下一条评论......
      • // // 不确定这是否 100% 准确,但已经足够接近 // inline void stack_trace () { size_t stack = reinterpret_cast(&stack); VirtualQuery (reinterpret_cast(stack), &mbi_current, sizeof (mbi_current)); VirtualQuery (mbi_current.BaseAddress, &mbi_base, sizeof (mbi_base)); size_t stack_size = reinterpret_cast(mbi_current.BaseAddress) + mbi_base.RegionSize - 堆栈; if (stack_size > max_stack) max_stack = stack_size; //printf ("stack_size = %d\n", stack_size); }
      • 查看此处以获得该 stack_trace 函数的正确格式版本:gnugos60.svn.sourceforge.net/viewvc/gnugos60/trunk/GNUGoS60/…
      猜你喜欢
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 2010-12-04
      • 2015-12-09
      • 2011-10-31
      • 2023-03-23
      • 2013-12-22
      • 2018-01-29
      相关资源
      最近更新 更多