打印

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

[复制链接]
1536|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这些统计数据,

难道应该是看汇编么?这个我不懂啊。

使用特权

评论回复
5
dld2| | 2008-6-18 11:13 | 只看该作者

临时变量在堆栈分配的

在RW data和ZI data中看不到。

使用特权

评论回复
6
xlander|  楼主 | 2008-6-18 20:54 | 只看该作者

谢谢两位。

==

使用特权

评论回复
7
平常人| | 2008-6-18 21:31 | 只看该作者

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

后面的b和c对以后的程序不会产生影响,被优化掉了;if语句也随之被优化掉了。

使用特权

评论回复
8
thw| | 2008-6-19 02:05 | 只看该作者

。。。

如果 b 、c在后面没有reference的话,直接就被编译器干掉了。
如果都有人引用,都会留下

使用特权

评论回复
9
flanker| | 2008-6-20 21:59 | 只看该作者

编译期在栈内存里面分配

除非用C51,否则都是在栈内存里面分配局部变量

使用特权

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

本版积分规则

65

主题

165

帖子

0

粉丝