c ++-“假设”规则到底是什么?

如标题所示,

“假设”规则到底是什么?

一个典型的答案是:

允许任何和所有代码转换而不会改变程序可观察行为的规则

我们会不时地从某些实现中获取归因于该规则的行为。 很多次是错误的。 所以,这到底是什么规则。 该标准没有清楚地将此规则作为一个部分或段落提及,那么该规则的作用范围到底是什么呢? 对我来说,这似乎是一个灰色区域,该标准未对其进行详细定义。 有人可以引用标准的参考文献来详细说明细节吗?

注意:将其标记为C和C ++,因为它与两种语言都相关。

Alok Save asked 2019-09-22T21:37:20Z
2个解决方案
80 votes

什么是“假设”规则?

“假设”规则基本上定义了允许实现在合法C ++程序上执行的转换。 简而言之,允许所有不影响程序“可观察到的行为”的转换(请参见下面的精确定义)。

目的是让实现者可以自由地执行优化,只要程序的行为与抽象机器方面的C ++标准指定的语义保持一致即可。


标准在哪里引入此规则?

C ++ 11标准在第1.9 / 1段中引入了“视情况”规则:

本国际标准中的语义描述定义了参数化的不确定性摘要   机。 本国际标准对一致性实现的结构没有要求。   特别是,它们不需要复制或模拟抽象机的结构。 相反,符合   需要实现以(仅)模拟抽象机的可观察到的行为,如下所述   下面。

另外,一个解释性脚注增加了:

这项规定有时称为“假设”规则,因为实现可以自由地忽略此要求   国际标准,只要其结果符合要求,则可从   程序的可观察行为。 例如,如果实际实现可以,则无需评估表达式的一部分   推断未使用其值,并且不会产生影响程序可观察行为的副作用。


该规则究竟规定了什么?

第1.9 / 5段进一步规定:

执行格式正确的程序的合格实现应产生相同的可观察行为   作为具有相同程序的抽象机对应实例的可能执行之一   和相同的输入。 但是,如果任何此类执行包含未定义的操作,则此国际   Standard对使用该输入执行该程序的实现没有任何要求(甚至没有要求   关于第一个未定义操作之前的操作)。

值得强调的是,此约束仅在“执行格式正确的程序”时适用,并且执行包含未定义行为的程序的可能结果不受限制。 第1.9 / 4段也明确指出了这一点:

本国际标准将某些其他操作描述为未定义(例如,效果   尝试修改const对象)。 [注意:本国际标准对   包含未定义行为的程序的行为。 —尾注]

最后,关于“可观察到的行为”的定义,第1.9 / 8段如下:

符合标准的实现的最低要求是:

—严格根据抽象机的规则评估对易失对象的访问。

—在程序终止时,写入文件的所有数据应与以下可能结果之一相同:   将根据抽象语义执行程序。

—交互式设备的输入和输出动态应以提示方式   输出实际上是在程序等待输入之前传递的。 什么构成互动设备   是实现定义的。

这些统称为程序的可观察行为。 [注意:更加严格   抽象语义和实际语义之间的对应关系可以由每种实现方式定义。 -结束   注意 ]


在某些情况下该规则不适用吗?

据我所知,“按条件”规则的唯一例外是复制/移动省略符,即使类的复制构造函数,move构造函数或析构函数具有副作用,也允许这样做。 确切的条件在第12.8 / 31段中指定:

当满足某些条件时,允许实现省略类的复制/移动构造   对象,即使为复制/移动操作选择了构造函数和/或为对象选择了析构函数   有副作用。[...]

Andy Prowl answered 2019-09-22T21:39:56Z
9 votes

在C11中,该名称永远不会调用该规则。 但是C就像C ++一样,用抽象机来定义行为。 C11 5.1.2.3p4和p6中的规则是:

  1. 在抽象机中,所有表达式均按语义指定的方式求值。 如果实际实现可以推断出未使用表达式的值并且没有产生所需的副作用(包括由调用函数或访问易失性对象引起的副作用),则无需对表达式的一部分进行求值。

  2. [...]

  3. 符合标准的实现的最低要求是:

    • 严格根据抽象机的规则评估对volatile对象的访问。
    • 在程序终止时,所有写入文件的数据应与根据抽象语义执行程序所产生的结果相同。
    • 交互式设备的输入和输出动态应按照7.21.3的规定进行。 这些要求的目的是尽快显示未缓冲或行缓冲的输出,以确保在程序等待输入之前确实出现提示消息。

     

    这是程序的可观察行为。

Antti Haapala answered 2019-09-22T21:40:58Z
translate from https://stackoverflow.com:/questions/15718262/what-exactly-is-the-as-if-rule