免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 21085 | 回复: 15
打印 上一主题 下一主题

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

论坛徽章:
0
1 [报告]
发表于 2007-05-18 15:21 |显示全部楼层
存在。
不是临时用到动态分配的。

在LINUX GCC如此。其它应该同。

论坛徽章:
0
2 [报告]
发表于 2007-05-18 16:59 |显示全部楼层
你看书的结论不算。应该看程序(汇编)。

生存其在整个函数中。(LINUX/GCC)

原帖由 tyc611 于 2007-5-18 16:56 发表
如果不进入条件分支,就不存在,它的生存期在块内

论坛徽章:
0
3 [报告]
发表于 2007-05-18 17:12 |显示全部楼层
局部变量都有自己的生存期. . . . . .

原帖由 missjiang 于 2007-5-18 17:10 发表
林妹妹永远的离开了我们 . . . . . .

论坛徽章:
0
4 [报告]
发表于 2007-05-18 20:06 |显示全部楼层
哪里有标准规定这个?
我没有找过. 如果你知道, 可以共享贴

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

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




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

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

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

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

论坛徽章:
0
6 [报告]
发表于 2007-05-21 16:08 |显示全部楼层
to beepbug,

if (xxx) {
   int i;

}

i 无论XXX是真是假,无论进入不进入if{},都已经是分配的了. 是在进入if所在的FUNCTION开始分配的. 和进入if无关.

LZ问的动态的意思是是否随着if(xxx)的进入而按需要分的(如果不进入就不分), 从这意义上不是动态的. 当然相对与if所在函数是动态的.但LZ问的不是哪个意思.

编译WHY这么做?为了效率,同时不违反什么

什么叫"不能看程序"?
许多问题倒是"不能看书"得到答案.

论坛徽章:
0
7 [报告]
发表于 2007-05-21 20:59 |显示全部楼层
to 楼上,

我看了LZ的问题几秒后就弄清问题了,也说出正确答案了.
是你没有弄清, 才说了那么多海阔天空来.

原帖由 beepbug 于 2007-5-21 20:49 发表


我没叫你别看程序。只是说,先要弄清问题。
我劝你还是要看书。看看进程与存储分配方面的书。

论坛徽章:
0
8 [报告]
发表于 2007-05-21 21:10 |显示全部楼层
TO beepbug,

你根本没有弄明白,根据书本的理论在加符合逻辑的想象就得出了不正确的结论.
许多编译根本没有根据"代码块"动态地" "压栈" "弹出". GCC+就没有.

还有,这东西你争论什么? 这不是不存在事实的理论性的东西还可以争论和有争论的余地.
这个是一个十分简单的事实. 不具有争论的前提. 在G++上看一下C产生的汇编代码就有结论了.

可能有例外. 比如在什么其他编译上.



原帖由 beepbug 于 2007-5-21 20:55 发表
局部变量生成在栈里。当进入它所在的代码块时,生成(实质上是做压栈操作),离开该代码块时,消失(弹出操作。实际上该变量还在,只是逻辑上我们认为它不存在了,不可访问了。)。再次进入该代码块时,再次生成。 ...

论坛徽章:
0
9 [报告]
发表于 2007-05-21 21:49 |显示全部楼层
自己看吧.



  1. #include <stdio.h>
  2. main(int argc, char **argv)
  3. {
  4. int i;
  5.   i = 123;
  6.   if(argc) {
  7.         int a[128];
  8.         a[1] = 456;
  9.   }
  10. }



  11.         .file   "tt.c"
  12.         .text
  13. .globl main
  14.         .type   main,@function
  15. main:
  16.         pushl   %ebp
  17.         movl    %esp, %ebp
  18.         subl    $536, %esp
  19.         andl    $-16, %esp
  20.         movl    $0, %eax
  21.         subl    %eax, %esp
  22.         movl    $123, -12(%ebp)
  23.         cmpl    $0, 8(%ebp)
  24.         je      .L2

  25.         //这里就是if块内. 512个字节空间早在外面就留好了的. 块内无动态申请归还
  26.         movl    $456, -532(%ebp)

  27. .L2:
  28.         leave
  29.         ret
  30. .Lfe1:
  31.         .size   main,.Lfe1-main
  32.         .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"

复制代码

论坛徽章:
0
10 [报告]
发表于 2007-05-22 08:39 |显示全部楼层
是GCC计算调整(优化?)STACK的什么方法。没有深入研究。
如果程序是这样(多分100个整数),那么调整成为更复杂的:


  1. main(int argc, char **argv)
  2. {
  3. int i;
  4. int k[100];
  5.   i = 123;
  6.   if(argc) {
  7.         int a[128];
  8.         a[1] = 456;
  9.   }
  10. }

  11. --------
  12.         movl    $0, %eax
  13.         addl    $15, %eax
  14.         addl    $15, %eax
  15.         shrl    $4, %eax
  16.         sall    $4, %eax
  17.         subl    %eax, %esp



复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP