/* fact.c */ #include "fact.h" int fact(int n) { if(n < 0) return 0 else if (n == 0) return 1; else if (n == 1) return 1; else return n*fact(n-1); }
引用 9 楼 icessl 的回复:Q2. 尾递归可以大大提高效率 A2. 提高的幅度很有限,可以忽略. 若用尾递归的话,开辟一个栈帧就可以了!不会像普通递归那样,递归多少次就开辟多少栈帧。所以提高的幅度肯定很大啊!
Q1. 若返回值是个大结构体,那必然不是4字节了吧. A1. 是的. 所以不主张返回结构体,而是返回指针. Q2. 尾递归可以大大提高效率 A2. 提高的幅度很有限,可以忽略. Q3. 是否还需要考虑栈帧之间的空余内存 A3. 不需要.实际上,栈帧之间没有空余内存.
Q2. 尾递归可以大大提高效率 A2. 提高的幅度很有限,可以忽略.
好像操作系统不同,对栈的大小定义也不同。 在JAVA中定义栈大小默认是48K,最小可以设置为32K。
一般而言,在 X86 32位系统中,一次函数调用消耗的栈空间大约是: 4字节返回地址; 4*n字节的参数,n是参数个数; 12字节的寄存器保护区(EBP ESI EDI) 4*m字节局部变量,m 是声明在函数内部变量的个数 所以,对于楼主给出的实例,一次调用耗用的内存大小是 4+4*1+12=20字节 若递归 1000 次,大约耗 20KB 栈空间 若递归……
一般而言,在 X86 32位系统中,一次函数调用消耗的栈空间大约是: 4字节返回地址; 若递归……
谢谢!不过我这里主要想知道对栈内存的使用情况。请教一下:是否主要是形参n和返回值的占用总空间再乘以1000或者10000呢? ……
对于x86架构来说,基本就是push和pop指令。函数调用的时候一般只会push函数自己会用到的寄存器。用到很多寄存器的话那就会push很多东西。 具体push了什么东西直接翻汇编就知道了。
33,008
社区成员
35,326
社区内容
加载中
试试用AI创作助手写篇文章吧