打印
[8/16-bit MCU]

一个简单表达式,为何计算完成后占用堆栈...

[复制链接]
822|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
forthlab|  楼主 | 2016-5-19 22:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 forthlab 于 2016-5-24 08:46 编辑

一个简单的程序,计算d = 1325.531 + 33459.003*T - 345.59*T*T - 67.890048*T*T*T;函数内有很多类似的计算,发现函数把内存都占用了;
单步执行后发现,表达式计算中会占用内存,计算完成后,并没有完全释放内存,还残留了部分内存没有释放;
结果很多类似公式,把内存都用完了;

测试程序如下

double T;
void fun1()
{
double d;

........
//代码1
//此时sp=503
d = 1325.531 + 33459.003*T - 345.59*T*T - 67.890048*T*T*T;
//此时sp=4c3,多占用了64byte堆栈
................}


//将表达式打散了,计算完成后,占用的内存都释放了;
void fun2()
{
double d;

................
//代码2
//此时sp=503
d =   -67.890048
d *= T;
d +=  - 345.59;
d *= T;
d += 33459.003;
d *= T;
d += 1325.531;
//此时sp=503,没有多消耗堆栈
...........
}

我的疑问: 编译器用那个代码1 计算完成公式后,为何会多占用64byte堆栈区?

C编译器不就是负责管理类似的内存的么

相关帖子

沙发
forthlab|  楼主 | 2016-5-19 22:40 | 只看该作者
本帖最后由 forthlab 于 2016-5-19 22:46 编辑

fun1() fun2() 函数是做同样的事情;

本来我用c写完整公式,简洁,也不会错,因为函数内有很多类似的公式,很快就把内存给消耗光了;单步执行也没有发现问题,后来看寄存器才发现堆栈消耗光;

但按照我的理解,C实现这个算法,fun1和fun2应该没有差别的啊.
难道用C编程,这么简单的公式还要我们再做手工优化?要把公式打散了?


我用的是CW6.3, CPU是 AC32
难道CW6.3的C编译器太弱智?
没有用其他CPU的编译器测试过




使用特权

评论回复
板凳
forthlab|  楼主 | 2016-5-20 09:12 | 只看该作者
本帖最后由 forthlab 于 2016-5-20 09:21 编辑

今天用Cw10.6测试了一下,情况一样:公式用一个C表达式,代码计算完成后,会在堆栈区遗留64字节;
将公式打散,一个一个写,代码计算完成后,不会在堆栈区遗留任何字节;

double T;

void main(void)
{
   double d,x;
  
  PE_low_level_init();                                                  //sp=108
  x = 1325.531 + 33459.003*T - 345.59*T*T - 67.890048*T*T*T;
               //sp= c8,堆栈区被占用了64字节

   d =   -67.890048;       //sp= c8
  d *= T;        //sp= c8
  d +=  - 345.59;       //sp= c8
  d *= T;       //sp= c8
  d += 33459.003;       //sp= c8
  d *= T;       //sp= c8
  d += 1325.531;       //sp= c8

} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/





使用特权

评论回复
地板
forthlab|  楼主 | 2016-5-20 09:36 | 只看该作者
刚才将double修改为float
结果是:
     double类型占用堆栈64字节,float类型占用32字节

其他不变

使用特权

评论回复
5
forthlab|  楼主 | 2016-5-27 08:37 | 只看该作者
没人明白?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

749

帖子

5

粉丝