" as-if"这些规则涵盖了规则:
符合实施的最低要求是:
严格按照抽象机的规则评估对易失性对象的访问。
在程序终止时,写入文件的所有数据应与执行程序的可能结果相同 根据抽象语义会产生。
交互式设备的输入和输出动态应以促使输出实际传递的方式进行 在程序等待输入之前。什么构成互动 设备是实现定义的。
这些统称为程序的可观察行为。
...访问由volatile glvalue(3.10)指定的对象, 修改对象,调用库I / O函数或调用 执行任何这些操作的功能都是副作用 是执行环境状态的变化。 ...
但是,让我们采取以下计划:
while (1) { }
// or
for (;;) { }
事实上,没有对象或函数调用,因此没有副作用,因此执行环境的状态没有变化"。什么阻止编译器将此代码编译为
xorl %eax, %eax
retq
这是不确定性的吗?一个无限循环本质上是"这里是一个标签,一遍又一遍地跳到它上面。并将继续,直到计算机关闭。代码没有任何意义,没有计算,没有I / O输出等。
在内核代码中,无限循环变得有趣。但是在用户空间代码中,无限循环通常是编写错误程序的标志。那么我的逻辑中的缺陷是什么?
答案 0 :(得分:3)
它可以,因为[intro.multithread] / p27(引用N4140;这是N3337中的p24):
实现可以假设任何线程最终都会执行一个 以下内容:
- 终止,
- 调用库I / O函数,
- 访问或修改易失性对象,或
- 执行同步操作或原子操作。
在C ++ 11及更高版本中,空无限循环是UB。