[intro.execution]/12中术语volatile的相关性是什么?
[简介执行]/12:
读取由volatile指定的对象、修改对象、调用库I/O函数或调用执行这些操作的函数都是副作用,这些都是执行环境状态的变化。表达式(或子表达式)的计算通常包括值计算(包括确定用于glvalue计算的对象的标识和获取之前分配给对象用于prvalue计算的值)和副作用的启动。当对库I/O函数的调用返回或对易失性对象的访问进行评估时,即使调用(如I/O本身)或易失性访问暗示的某些外部操作可能尚未完成,副作用也被视为已完成。
volatile的全部目的是向编译器表明“您实际上不知道访问这个变量的结果是什么,所以不要弄乱它”。
例如,我们有:
int x = 7;
...
int func1()
{
return x;
}
...
int func2()
{
return func1() + func1();
}
编译器可以(有些人认为应该)将其转换为返回2*func1() [只需一次加法即可轻松计算]。
但是,如果x
是一个硬件寄存器[因此return x;
的行为实际上类似于return x;
],并且随着每次读取而变化(例如,它是一个计数器寄存器),那么func1()func1()
不能,也不应该优化为2*func1()
-避免编译器这样做
volatile int x
将实现这一点[不幸的是,在普通C代码中无法导致这种行为/需要一些真正的硬件]
硬件寄存器是volatile的正常使用情形(通常与指针结合,但不一定是),寄存器的读取可能会对硬件产生实际的副作用-例如,读取串行端口[或网卡、硬盘或其他]上的fifo寄存器将影响硬件的状态,因为fifo现在已经“前进”了一步。跳过、复制、缓存优化结果或其他此类优化肯定会导致驱动程序代码和硬件的行为方式与程序员想要的不同-如果volatile没有被视为具有副作用,则会出现这种情况。
问题内容: 在HTML中作为背景色输入时,某些随机字符串如何产生颜色?例如: … 在所有浏览器和平台上产生 背景 为 红色 的文档。 有趣的是,虽然也会产生红色背景,但也会产生黄色背景。 这里发生了什么? 问题答案: 这是Netscape时代的遗留物: 丢失的数字被视为0 […]。不正确的数字被简单地解释为0。例如,值#F0F0F0,F0F0F0,F0F0F,#FxFxFx和FxFxFx都相同。
问题内容: Oracle有关原子访问的文档(位于http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)说: “一个易失性变量建立了一个事前发生的关系…。这意味着……当线程读取一个易失性变量时,它不仅看到了对易失性的最新更改,而且还看到了导致该代码的副作用改变。” 我无法解决这个问题。我了解volatile变
Gradle 是一个能通过插件形式自定义构建逻辑的优秀构建工具。 以下的一些特性让我们选择了 Gradle: 使用领域专用语言(DSL)来描述和控制构建逻辑 构建文件基于 Groovy,并允许通过 DSL 来声明元素、使用代码操作 DSL 元素这样的混合方式来自定义构建逻辑 内置了 Maven 和 Ivy 来进行依赖管理 相当灵活。允许使用最好的实现,但是不会强制实现的形式 插件可以提供它们的 D
这个答案几乎描述了问题的前半部分。 上面写着: 看过“四人帮”的定义后,我不相信这有什么真正的区别。(为方便起见包括在内) 装饰器:允许对对象进行动态包装,以便修改它们现有的职责和行为 责任链:通过将接收对象链接在一起,使多个对象有机会处理请求 维基百科对它们做了一些补充,但有些是武断的。 > 装饰器通常作为链表实现。但我认为这太低了,不能被认为是模式的“一部分”。 责任链只处理数据,如果这是他们
来自ISO/IEC 9899:201x第5.1.2.3节程序执行: 2访问一个易失性对象,修改一个对象,修改一个文件,或者调用一个做那些操作中任何一个的函数,都是副作用,都是执行环境状态的改变。表达式的计算通常包括值计算和副作用的启动。用于lvalue表达式的值计算包括确定指定对象的标识。 因此,访问(读\写)volatile被称为副作用。让我们继续: 6对符合要求的实施的最低要求是: > 对易失
我在玩Java的可选代码,认为它的工作原理就像一个if else块。但是在下面的代码中,即使变量不是,也会执行块的内容。有什么解释吗? 产出: