LinuxSir.cn,穿越时空的Linuxsir!

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

求助!超级恐怖!用gcc -O2 选项编译 while(int a){} 出现“死机”

[复制链接]
发表于 2006-11-24 20:41:25 | 显示全部楼层 |阅读模式
比如:

/* test.c */

#include <stdio.h>
#include <signal.h>

int a= 1;
void int_handler();

main()
{
     signal(SIGINT, int_handler);

    while(a){}

    printf("abc\n");
}

void int_handler()
{
    a = 0;
}

若 gcc -o test test.c
编译运行后, 输入 Control + c 即可正常输出 abc

但若 gcc -O2 -o test test.c
编译运行后,输入 Control + c 不起任何作用!!!!!!!!!!!

求助!

hoho_zhao
发表于 2006-11-24 21:09:39 | 显示全部楼层
O2做了什么?难道是把while(a)中的a给你弄成1了??
关注。
回复 支持 反对

使用道具 举报

发表于 2006-11-24 21:13:53 | 显示全部楼层
volatile int a. 你在 single handler  中修改的人家当然不知道了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-24 22:07:40 | 显示全部楼层
确实行的通!! 谢谢版主!!!

不过,可否说一下,之前我为什么直接 gcc -o 就可以,但是 gcc -O2 -o 就不行

-O2 做了哪些优化或改变?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-24 22:20:29 | 显示全部楼层
再次添加详细信息:

假如若“不”将 int a 设置为 volatile int a

若在while(a){} 里面添加 printf("abc\n");

即将while(a){}
改为while(a){printf("abc\n");}

则 gcc -o test  test.c 和 gcc -O2 -o test test.c 都行的通
若没有printf语句,则 -O2 行不通

这是为什么!!?????
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-24 22:23:21 | 显示全部楼层
我上面所说的“行的通”/“行不通”是指 按 control + c 会不会响应
回复 支持 反对

使用道具 举报

发表于 2006-11-25 10:41:18 | 显示全部楼层
用-S看一下编译出来的汇编代码就知道编译器作了什么样的优化了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-25 17:11:45 | 显示全部楼层
好的,我会试试 -S 。请 gamedragon 兄 看看另一个一样的帖子, khc 兄做了解释。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-25 22:10:04 | 显示全部楼层
今天面试去了,有空再试试吧。。。
回复 支持 反对

使用道具 举报

发表于 2006-11-26 01:44:58 | 显示全部楼层
其实就是CPU 寄存器里的值和内存的值不一致。
优化到CPU 寄存器里了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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