有没有办法可以衡量一个函数使用多少堆栈内存?
这个问题并不特定于递归函数; 但我有兴趣知道递归函数会占用多少堆栈内存.
我有兴趣优化堆栈内存使用的功能; 然而,在不知道编译器已经进行了哪些优化的情况下,如果这是在做出真正的改进,那只是猜测.
需要明确的是,这不是关于如何优化以获得更好的堆栈使用的问题
那么是否有一些可靠的方法来找出函数在C中使用了多少堆栈内存?
注意:假设它不使用alloca或可变长度数组,应该可以在编译时找到它.
这是特定于 GCC的(已通过gcc 4.9测试):
在函数上方添加以下代码:
#pragma GCC diagnostic error "-Wframe-larger-than="
Run Code Online (Sandbox Code Playgroud)
其中报告错误,例如:
error: the frame size of 272 bytes is larger than 1 bytes [-Werror=frame-larger-than=]
Run Code Online (Sandbox Code Playgroud)
虽然有些奇怪,但是您至少可以在编辑文件时快速完成此操作。
您可以将其添加-fstack-usage到CFLAGS中,然后CFLAGS会在目标文件旁边写出文本文件。请参阅:https :
//gcc.gnu.org/onlinedocs/gnat_ugn/Static-Stack-Usage-Analysis.html虽然效果很好,但根据您的构建系统/配置,它可能会有些不便-使用不同的CFLAG,尽管这当然可以自动化。–(感谢@nos的评论)
注意,
似乎大多数/所有编译器的自然方法都依赖于猜测-在优化之后并不能100%保证其准确性,因此至少可以使用免费的编译器给出确定的答案。