LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1072|回复: 7

请版主再看看我跟进的关于 gcc -O2 的信息

[复制链接]
发表于 2006-11-24 22:37:44 | 显示全部楼层 |阅读模式
再谢!

若用 int a;
加入 while(a) {printf("abc");}
则 gcc -o test test.c 和 gcc -O2 -o test test.c
都可以通过 Control + c 来改变 a 值来跳出 while循环

若 while(a){}

   int i;
   while(a){i++;}
都不行!

就是在 while中加入 printf语句或“更复杂”一些的语句才在 -O2下 Contro + c 成功

唉。。。。。不明不白。。。。。
发表于 2006-11-25 06:23:26 | 显示全部楼层
gcc 不知道 printf 會不會把 int a 的內容改掉,當然不能把 while(a) 優化成 while(1)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-25 10:15:40 | 显示全部楼层
gcc 不知道 printf 會不會把 int a 的內容改掉,當然不能把 while(a) 優化成 while(1)

不是很明白你说的,你可以先看看我之前的一帖,那里有完整的一个程序:(谢谢)
“求助!超级恐怖!用gcc -O2 选项编译 while(int a){} 出现“死机” ”
回复 支持 反对

使用道具 举报

发表于 2006-11-25 10:30:52 | 显示全部楼层
gcc 會把 while(a) 優化成 while(1) 是因為 gcc 覺得 a 不會被改變,如果在 while loop 以內用 printf 的話,因為 a 是 global 而 gcc 不知道 printf 會不會把 a 改成其他 value, 所以便不能用這個 optimization.

當然,也有可能 gcc 不是把 while(a) 優化成 while(1), 而只是把 a 放進 register,但原理差不多,所以如果你用 volatile 的話就能解決你的問題。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-25 17:09:16 | 显示全部楼层
谢谢 khc 兄的指导!!!

我想问一下,printf 在什么情况下会改变 a 的值呢? 它只不过是一个标准输出函数罢了。
回复 支持 反对

使用道具 举报

发表于 2006-11-25 18:38:42 | 显示全部楼层
我们用眼睛当然能够看出printf不会修改 a, 可是编译器如何得知 printf 只是一个标准输出函数, 而不是某个会修改 a 的函数呢? 为了简单起见, 编译器不会再跟进 printf 函数看个究竟, 只是假设 a 可能被修改, 这种假设是合理的, 因为如若不这样, 那么编译器要多做多少事情啊. 静态分析做不到也不需要做到把每个 call 都实际走一遍, 那其实已经是动态分析了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-25 22:08:48 | 显示全部楼层
看了 rickxbx 的跟帖:

如浴春风!!!!!!!
回复 支持 反对

使用道具 举报

发表于 2006-11-25 23:55:41 | 显示全部楼层
-S 看汇编
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表