免费注册 查看新帖 |

Chinaunix

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

被volatile 搞晕了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-22 15:05 |只看该作者 |倒序浏览
刚才搜索出来一个关于setjmp和longjmp的小程序如下:
#include<setjmp.h>
#include <stdio.h>

static jmp_buf  buf;

int main()
{
    // volatile int b;      // 1
    int b ;

    b =3;

    if(setjmp(buf)!=0)
    {
        printf("%d ", b);
        exit(0);
    }

    b=5;
    longjmp(buf , 1);

}

我的平台是:fc4,大家按照下面几种编译方式,分别看看运行结果,我被搞晕了。

(1)使用volatile,编译时不管优化参数(-O1, -O2..),结果都是5
(2)不使用volatile
             gcc 1.c           // 执行结果:5
             gcc -O1          // 执行结果:3
             gcc -O2          // 执行结果:3


为什么??

论坛徽章:
0
2 [报告]
发表于 2008-08-22 15:18 |只看该作者
volatile 不就是为了防止被优化吗?

论坛徽章:
0
3 [报告]
发表于 2008-08-22 15:43 |只看该作者
volatile在嵌入式里很重要,防止被优化。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2008-08-22 15:56 |只看该作者
volatile只是为了防止被优化,如果compiler本来就没打算在这里优化,结果自然一样

论坛徽章:
0
5 [报告]
发表于 2008-08-22 16:46 |只看该作者
原帖由 anank 于 2008-8-22 15:05 发表
刚才搜索出来一个关于setjmp和longjmp的小程序如下:
#include
#include

static jmp_buf  buf;

int main()
{
    // volatile int b;      // 1
    int b ;

    b =3;

    if(setjmp(buf)!= ...




结果应该是正常的,volatile的被放在内存中,那么值将改变为5;
优化的被放在寄存器中,因为longjmp将恢复寄存器的值,那么仍然为3.

论坛徽章:
0
6 [报告]
发表于 2008-08-22 16:51 |只看该作者
不同线程之间共用的变量是不是要加volatile?
谢谢。

论坛徽章:
0
7 [报告]
发表于 2008-08-23 18:07 |只看该作者

回复 #1 anank 的帖子

保证局部变量在longjmp中值不变的方式是将其声明为volatile

论坛徽章:
0
8 [报告]
发表于 2008-08-23 18:32 |只看该作者

回复 #1 anank 的帖子

还是那句话,引自APUE2:

Unfortunately, the answer is "it depends." Most implementations do not try to roll back these automatic variables and register variables, but the standards say only that their values are indeterminate. If you have an automatic variable that you don't want rolled back, define it with the volatile attribute. Variables that are declared global or static are left alone when longjmp is executed.

论坛徽章:
0
9 [报告]
发表于 2008-08-25 13:34 |只看该作者
非常谢谢大家的讲解,我明白了,是我对 longjmp函数 产生误解。

原来我认为:
--------------
       当发生错误时,longjmp会恢复“内存”到原来的模样

正确的应该是:
       longjmp只会恢复“寄存器”到原来的模样,内存的改变已经不能恢复

要是这样的话,似乎longjmp没有啥用处啊,内存都发生改变了,状态还是变了啊????

论坛徽章:
0
10 [报告]
发表于 2008-08-25 13:44 |只看该作者
仔细看看8楼贴出来的那段话,嗯,不过他贴得少了些,去看一个完整点的版本。

longjmp不只是恢复寄存器的。

另外,这个东西主要用于出错处理的,不是一般的用于控制流转移的。
原帖由 anank 于 2008-8-25 13:34 发表
非常谢谢大家的讲解,我明白了,是我对 longjmp函数 产生误解。

原来我认为:
--------------
       当发生错误时,longjmp会恢复“内存”到原来的模样

正确的应该是:
       longjmp只会恢复“寄存 ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP