【发布时间】:2015-04-13 20:13:53
【问题描述】:
有没有一种方法可以测量一个函数使用了多少堆栈内存?
这个问题不是针对递归函数的;但是我很想知道递归调用的函数会占用多少堆栈内存。
我有兴趣优化堆栈内存使用的函数;但是,在不知道编译器已经进行了哪些优化的情况下,这只是猜测是否会进行真正的改进。
需要明确的是,这不是关于如何优化以更好地使用堆栈的问题
那么有没有一些可靠的方法可以找出函数在 C 中使用了多少堆栈内存?
注意:假设它没有使用alloca 或可变长度数组,
应该可以在编译时找到它。
【问题讨论】:
-
你可以。您需要找到描述您正在使用的平台的 ABI 以及给定语言类型的语言映射的文档。之后,您需要深入研究编译器的文档并找到有关组织堆栈帧和优化自动变量的实现细节。在阅读完所有这些内容后,您将简单地生成汇编输出并查看堆栈指针的实际使用情况,否则它会变得乏味且不准确......
-
我还没有尝试过,但是如果你想动态地发现这一点,比如递归调用层次结构,我想到的一个想法是在你感兴趣的函数之前调用一个函数,它分配一个非常大的堆栈缓冲区并将其初始化为已知模式,例如 [0,1,2,3,4,5,6...,0,1,2,3,4,5...] 和然后调用一个伴随函数,它检查有多少已知模式仍然完好无损。当然,这不会精确到字节,但可以大致了解堆栈的使用情况。
-
“只生成汇编输出,看看栈指针是如何实际使用的” 如果你用gcc编译,你可以使用
-S选项生成一个汇编文件来自您的 .c 文件,您可以使用任何文本编辑器对其进行检查。另一种选择是使用显示汇编代码的调试器。这样,您可以单步执行代码并查看堆栈指针和基指针是如何使用的。 -
为什么要优化堆栈使用?这很奇怪,因为没有必要根据 c 标准进行堆栈实现。即使有,堆栈的使用方式完全取决于编译器和操作系统,
-
@ideasman42 您可以查看编译器手册以了解编译器特定的功能。例如如果您使用 gcc,您可以让它使用
-fstack-usage标志告诉您每个函数的堆栈使用情况 - 您必须自己计算调用图的使用情况(例如,如果函数是递归的,乘以递归次数。)
标签: c stack-memory