1
在程序的正文中,是否可以确定堆栈上的非递归函数而无需外部计算?我需要这个为非常小的微控制器(如AVR)中的线程分配内存资源。在函数调用之前我需要知道这一点。指令 - 不幸的是,堆栈使用非常无用。或者我有些不明白?如何计算GCC中被调用函数的树的所需堆栈大小
在程序的正文中,是否可以确定堆栈上的非递归函数而无需外部计算?我需要这个为非常小的微控制器(如AVR)中的线程分配内存资源。在函数调用之前我需要知道这一点。指令 - 不幸的是,堆栈使用非常无用。或者我有些不明白?如何计算GCC中被调用函数的树的所需堆栈大小
获取传递参数的地址会使其位于堆栈上。因此,运行以下命令:
#include <stdio.h>
void my_fun(int dummy);
int get_stack_space(int dummy);
int main(void)
{
int dummy = 0;
my_fun(dummy);
return 0;
}
void my_fun(int dummy)
{
// do stuff
printf("%d\n", get_stack_space((int)&dummy));
return;
}
int get_stack_space(int dummy)
{
return dummy - (int)&dummy;
}
应该给你打电话my_fun点之间的堆栈以字节为单位的距离()并调用get_stack_space()。希望能帮助到你。
编辑:在x86你)my_fun开始(在GCC
对不起,我不是很详细的问这个问题。我需要这个为非常小的微控制器(如AVR)中的线程分配内存资源。它在函数调用之前需要知道。 – Vyacheslav
有调用my_fun()+机器字为EBP的推动时,你得到的距离+机器字的返回地址的推是-fstack-usage选项;它会报告每个函数的堆栈使用情况https://gcc.gnu.org/onlinedocs/gnat_ugn/Static-Stack-Usage-Analysis.html。另一个人写了一个脚本来计算调用树的堆栈使用情况https://github.com/PeterMcKinnis/WostCaseStack – MichaelMoser
@MichaelMoser是的,但收到的值不考虑嵌套的调用。 – Vyacheslav
我认为推进编译器会更好。 – Vyacheslav