【发布时间】:2014-08-23 00:35:53
【问题描述】:
来自 msdn 博客的 this article 的一个例子让我很兴奋:
上面写着这个函数:
void unwitting(bool door_is_open)
{
if (door_is_open) {
walk_on_in();
} else {
ring_bell();
// wait for the door to open using the fallback value
fallback = value_or_fallback(nullptr);
wait_for_door_to_open(fallback);
}
}
可以优化成这个:
void unwitting(bool door_is_open)
{
walk_on_in();
}
因为调用value_or_fallback(nullptr) 是未定义的行为(本文前面已经证明了这一点)。
现在我不明白的是:运行时只有在到达该行时才会进入未定义的行为。在运行时间进入 UB 之前,第一段的所有可观察到的效果都已解决,因此不应该在这里应用发生前/发生后的概念吗?
【问题讨论】:
-
LOL 我习惯 UB 点披萨或者给老板发辞职信,这时间旅行听起来很酷:D
-
时间旅行是“未定义行为”的一种完全有效的形式。
-
您的问题的答案是您引用的博客文章:如果在执行过程中的任何时候发生未定义的行为,则整个执行是未定义的,并且“任何事情都可能发生”适用于整个执行.另一个定义将阻止大多数指令在“可观察效果”中重新排序,因为大多数指令可能具有未定义的行为。
-
该标准明确允许在 UB 下进行时间旅行。编译器使用此权限来利用原本无法获得的优化机会。
-
标准的相关段落:1.9/5“如果任何此类执行包含未定义的操作,则本国际标准对使用该输入执行该程序的实现没有任何要求(甚至不考虑到第一个未定义操作之前的操作)。"