【问题标题】:Does C99 standard define observable behavior as C++03 does?C99 标准是否像 C++03 那样定义可观察行为?
【发布时间】:2014-05-05 10:03:42
【问题描述】:

在 C++03 标准 1.9/6 中有 可观察行为的定义

抽象机器的可观察行为是它对易失性数据的读取和写入顺序以及对库 I/O 函数的调用。

并且标准详细解释了编译器在进行优化时必须保留可观察的行为

但是,我正在查看的 C99 草案中没有这样或类似的定义。唯一提到可观察行为的是 6.7.3/7

restrict 限定符(如寄存器存储类)的预期用途是提升 优化,并从符合标准的程序中删除限定符的所有实例 不改变其含义(即可观察的行为)

在优化 C99 程序时,是否有编译器必须保留的确切定义?

【问题讨论】:

    标签: c c99 compiler-optimization language-lawyer


    【解决方案1】:

    在我的草案第 3.4 节中,将行为定义为“外在表现或行为”。 “可观察的行为”似乎是只发生一次的 pleonasm。

    §5.1.2.3,程序执行,进一步定义了 C 程序的行为:

    本国际标准中的语义描述描述了与优化问题无关的抽象机器的行为。

    它接着将副作用定义为由“[a]访问易失性对象、修改对象、修改文件或调用执行任何操作的函数引起的“执行环境状态的变化”那些操作”。副作用在序列点进行排序。

    这似乎比 C++ 更严格,因为“修改对象”,即写入内存,是 C 中的(可观察的)行为。

    关于允许的优化:

    在抽象机中,所有表达式都按照语义的规定进行评估。一个 如果它可以推断出它的实际实现不需要评估表达式的一部分 没有使用值并且不会产生任何需要的副作用(包括任何由 调用函数或访问 volatile 对象)。

    “需要的副作用”然后在以下点列出:

    • 在序列点,易失性对象是稳定的,因为之前的访问是 完整且后续访问尚未发生。

    • 在程序终止时,写入文件的所有数据都应与以下结果相同 根据抽象语义执行程序会产生。

    • 交互式设备的输入和输出动态应按照 7.19.3.

    该段落以示例列表结尾; §7.19.3 描述了stdio 上下文中的文件。

    【讨论】:

    • 令我困惑的是,副作用包括“修改对象”。优化段落没有提到评估重新排序。所以它在任何情况下都不能重新排序以下语句: a = 1; b = 1;因为 ”;”是一个后果点,副作用(a = 1)必须在它之前发生。
    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多