加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

是否访问不能从C语言中的函数可观察行为外部访问的volatile变量

发布时间:2020-12-15 02:48:39 所属栏目:Java 来源:网络整理
导读:在C 03中,标准可观察行为(1.9 / 6)包括读取和写入易失性数据.现在我有这个代码: int main(){ const volatile int value = 0; if( value ) { } return 0;} 它正式初始化一个volatile变量然后读取它. Visual C 10发出机器代码,通过在那里推动dword在堆栈上腾
在C 03中,标准可观察行为(1.9 / 6)包括读取和写入易失性数据.现在我有这个代码:
int main()
{
    const volatile int value = 0;
    if( value ) {
    }
    return 0;
}

它正式初始化一个volatile变量然后读取它. Visual C 10发出机器代码,通过在那里推动dword在堆栈上腾出空间,然后将零写入该堆栈位置,然后读取该位置.

对我来说没有任何意义 – 没有其他代码或硬件可能知道本地变量的位置(因为它在自动存储中),所以期望变量可以由任何其他方读取/写入是不合理的,所以它在这种情况下可以消除.

是否允许消除此变量访问?访问易失性本地哪个地址不为任何其他方可观察的行为所知?

解决方法

线程的整个堆栈可能位于受保护的内存页面上,其中包含一个记录所有读取和写入的处理程序(当然也允许它们完成).

但是,我不认为MSVC真的关心是否或如何检测内存访问.除了其他事项外,它理解易失性意味着“不要对这个对象应用优化”.所以它没有.它没有意义,因为MSVC对加速volatile的这种使用不感兴趣.

由于它是依赖于实现的,是否以及如何实际观察到可观察的行为,我认为如果由于硬件的细节而知道无法检测到访问,则实现可以“作弊”.可以跳过没有物理上可检测到的影响的可观察行为:无论标准说什么,检测不合规行为的方法都限于物理上可能的.

如果一个实现不符合森林中的标准,没有人注意到,它是否发出声音?之类的事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读