程序分支{}中的变量是什么时候分配的?

[复制链接]
2222|8
 楼主| xlander 发表于 2008-6-18 10:30 | 显示全部楼层 |阅读模式
伪代码:
int a;
a = 10;
if(somecondition == true)
{
int b;
b = 20;
}
else
{
int c;
c = 40;
}

假设编译器是ads,硬件为arm, int变量为4字节。
这段程序即使经过优化的情况下,ram应该是占多少字节?
分析A:
C语言不支持动态分配变量,所以a,b,c在函数进入后,就已经分配好,占用3*4=12个字节。也就是说即使变量b所在分支永远得到不执行,也会分配内存。
分析B:
编译器会根据程序分支的情况,对变量分配进行优化,b,c复用,共用同一内存,所以占用2*4=8字节,也就是说,变量b只在得到执行的情况下,才会分配内存,其方法类似对子函数中变量的处理。

以上两种分析,那种正确?怎么验证?
dld2 发表于 2008-6-18 10:33 | 显示全部楼层

怎么验证?

到ADS里去试一下。
可能和优化级别有关。
 楼主| xlander 发表于 2008-6-18 11:03 | 显示全部楼层

我没验证出来,才让大家帮我

可能我写的代码不对,我分配了数组,rw data都没有变化
 楼主| xlander 发表于 2008-6-18 11:04 | 显示全部楼层

是不是我的方法不对?

我是编译后,看code,ro data,rw data这些统计数据,

难道应该是看汇编么?这个我不懂啊。
dld2 发表于 2008-6-18 11:13 | 显示全部楼层

临时变量在堆栈分配的

在RW data和ZI data中看不到。
 楼主| xlander 发表于 2008-6-18 20:54 | 显示全部楼层

谢谢两位。

==
平常人 发表于 2008-6-18 21:31 | 显示全部楼层

如果优化做得好,楼主的程序只用一句话:a=10

后面的b和c对以后的程序不会产生影响,被优化掉了;if语句也随之被优化掉了。
thw 发表于 2008-6-19 02:05 | 显示全部楼层

。。。

如果 b 、c在后面没有reference的话,直接就被编译器干掉了。
如果都有人引用,都会留下
flanker 发表于 2008-6-20 21:59 | 显示全部楼层

编译期在栈内存里面分配

除非用C51,否则都是在栈内存里面分配局部变量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

165

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部