查看: 1530|回复: 1

[其他] 为何计算一个简单表达式会占用堆栈...

[复制链接]

该用户从未签到

16

主题

56

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2020-11-20
发表于 2016-5-26 09:33:36 | 显示全部楼层 |阅读模式
本帖最后由 forthlab 于 2016-5-26 16:08 编辑

一个简单的程序,计算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编译器不就是负责管理类似的内存的么


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

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

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


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

-------------------------------------------------------------------------------
今天用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!!! ***/



-------------------------------------------------------------------------------------------
刚才将double修改为float
结果是:
     double类型占用堆栈64字节,float类型占用32字节

其他不变



我知道答案 目前已有1人回答
回复

使用道具 举报

该用户从未签到

16

主题

56

帖子

0

注册会员

Rank: 2

积分
164
最后登录
2020-11-20
 楼主| 发表于 2016-5-27 08:42:29 | 显示全部楼层
这个问题大家都没有关注过么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 12:09 , Processed in 0.084799 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表