在线时间19 小时
UID154891
注册时间2009-10-18
NXP金币0
该用户从未签到
注册会员

- 积分
- 164
- 最后登录
- 2020-11-20
|
本帖最后由 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字节
其他不变
|
|