免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: koolcoy
打印 上一主题 下一主题

求助: 在if中定义的变量 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-05-20 13:49 |只看该作者
什麼叫動態變量?-- 寄存器變量? 還是堆變量?

论坛徽章:
0
22 [报告]
发表于 2007-05-20 14:38 |只看该作者
通过看汇编已经给LZ了LINUX GCC的正确答案. 在其它平台上也应该一样,如果有不一样,请给出例证.

什么事情不要平想象. 要自己实验.




原帖由 beepbug 于 2007-5-20 08:37 发表

看汇编不说明问题。看C,和看汇编,都是在看代码的静态。只不过一个是在高级语言层面,一个是在低级语言层面罢了。

而楼主问的是,这代码在运行时,有没有 i 这个实体生成?

我想,应该if为true时,才在栈 ...

论坛徽章:
0
23 [报告]
发表于 2007-05-20 16:43 |只看该作者
原帖由 JohnBull 于 2007-5-20 10:05 发表
这要看在这个标准中,变量定义是否被看作普通语句了。
照你的说法,汇编源码中必然有根据条件对ESP进行调整的代码了,而实际上呢?
你只要自己写一段测试代码,去不同平台,用不同语言标准编译成汇编代码 ...


你先看清楼主的发帖:

像下面这样的代码如果这个if分枝没有被执行那么这个变量i是否存在? 我指的是物理上而不是逻辑上, 也就是这个i是不是动态分配的? (C语言, 不是C++)

再发言,好不好?至少先看清别人说的,再教训人,好不好?

据我理解,楼主说的是“执行”,也就是关于进程的问题。你看的,和你要求别人看的,是汇编代码,那是关于程序的。程序和进程是两码事,前者是静态的概念,后者是动态的概念。扯在一起,就变成鸡说鸭说了。

不过你说“去不同平台”,这有道理。我曾看见一篇关于并行计算的论文,说为了提高运行效率,遇分支时,条件判断,true分支、false分支,各引发一个线程来跑,再根据条件判断,来选择两个分支结果中的一个。在这样的平台上,i 总是会生成。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
24 [报告]
发表于 2007-05-20 16:52 |只看该作者
原帖由 beepbug 于 2007-5-20 16:43 发表
像下面这样的代码如果这个if分枝没有被执行那么这个变量i是否存在? 我指的是物理上而不是逻辑上, 也就是这个i是不是动态分配的? (C语言, 不是C++)

再发言,好不好?至少先看清别人说的,再教训人,好不好?

据我理解,楼主说的是“执行”,也就是关于进程的问题。你看的,和你要求别人看的,是汇编代码,那是关于程序的。程序和进程是两码事,前者是静态的概念,后者是动态的概念。扯在一起,就变成鸡说鸭说了。

楼主的问题扯不上进程。

[ 本帖最后由 MMMIX 于 2007-5-20 16:54 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2007-05-20 17:10 |只看该作者
原帖由 beepbug 于 2007-5-20 16:43 发表


你先看清楼主的发帖:

像下面这样的代码如果这个if分枝没有被执行那么这个变量i是否存在? 我指的是物理上而不是逻辑上, 也就是这个i是不是动态分配的? (C语言, 不是C++)

再发言,好不好?至少先看清别人 ...


他已经说得很明白了.

这是你说的:
我想,应该if为true时,才在栈里生成,并在代码段结束时弹出消失。

若是这样子,你会怎么生成代码? 目前的编译器恐怕都无法做得到

论坛徽章:
0
26 [报告]
发表于 2007-05-20 17:11 |只看该作者
为实体分配空间,有静态、动态之分。后者又分栈分配和堆分配。

所谓静态,是指在程序加载形成进程所做的分配。进程结束时消亡。

所谓动态,是在进程运行中做的分配。

看静态分配,只要看源码就行了。你要看汇编码也行。用GDB看机器码都一样。就是只看程序,就可了解。

动态分配就不能只看程序。程序里有的,在进程里不一定产生。栈分配是这样,堆分配也一样。否则叫啥动态分配?

论坛徽章:
0
27 [报告]
发表于 2007-05-20 17:15 |只看该作者
原帖由 beepbug 于 2007-5-20 17:11 发表
为实体分配空间,有静态、动态之分。后者又分栈分配和堆分配。

所谓静态,是指在程序加载形成进程所做的分配。进程结束时消亡。

所谓动态,是在进程运行中做的分配。

看静态分配,只要看源码就行了。你要 ...


  true 时生成动态分配变量 ?  在堆中用,编译器生成用 malloc() 的代码 ? 那在栈中怎么动态生成呢

论坛徽章:
0
28 [报告]
发表于 2007-05-21 11:29 |只看该作者
原帖由 mik 于 2007-5-20 17:15 发表
  true 时生成动态分配变量 ?  在堆中用,编译器生成用 malloc() 的代码 ? 那在栈中怎么动态生成呢


我说的已经很清楚了。再贴一次:

为实体分配空间,有静态、动态之分。后者又分栈分配和堆分配。
所谓静态,是指在程序加载形成进程所做的分配。进程结束时消亡。
所谓动态,是在进程运行中做的分配。
看静态分配,只要看源码就行了。你要看汇编码也行。用GDB看机器码都一样。就是只看程序,就可了解。
动态分配就不能只看程序。程序里有的,在进程里不一定产生。栈分配是这样,堆分配也一样。否则叫啥动态分配?

这个i在栈里。

动态分配≠堆分配,它包含堆分配,还有栈分配。

再说一遍,请先看清楼主的帖意:

像下面这样的代码如果这个if分枝没有被执行那么这个变量i是否存在? 我指的是物理上而不是逻辑上, 也就是这个i是不是动态分配的?

楼主是问“这个i是不是动态分配的? ”

不管对不对,我是在回答这个问题。我不知道你们两位版主是在回答什么问题?

对错,大家可以讨论。但不要跑题。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
29 [报告]
发表于 2007-05-21 11:38 |只看该作者
原帖由 JohnBull 于 2007-5-20 10:05 发表

这要看在这个标准中,变量定义是否被看作普通语句了。

照你的说法,汇编源码中必然有根据条件对ESP进行调整的代码了,而实际上呢?
你只要自己写一段测试代码,去不同平台,用不同语言标准编译成汇编代码,看看就知道了。

请帖出测试结果再进一步发言。

你这个话前后有点儿矛盾。
看标准没错,我想这个帖子的标准答案也只能从标准中得来。
至于“去不同平台,用不同语言标准编译成汇编代码”,我觉得即使看到了结果,如果找不到标准中必须要这么做的条文的话,那答案也是不完整的。

论坛徽章:
0
30 [报告]
发表于 2007-05-21 14:08 |只看该作者
原帖由 koolcoy 于 2007-5-18 15:05 发表
像下面这样的代码如果这个if分枝没有被执行那么这个变量i是否存在? 我指的是物理上而不是逻辑上, 也就是这个i是不是动态分配的? (C语言, 不是C++)

  1. if (xxx) {
  2. int i;
  3. }
复制代码

如果没有被执行当然不会在物理上分配资源了,它的生存周期在那对花括号“{}”中
如果不被执行当然也不会运行那个花括号所表示的语句(即花括号具有的属性和方法),当然不会分配资源鸟

LZ大概对物理及其逻辑之间的抽象关系木有深入的分析研究
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP