【问题标题】:Why was this statement in C99 changed in C11?为什么 C99 中的这条语句在 C11 中改变了?
【发布时间】:2020-08-22 12:20:49
【问题描述】:

C99 标准:

在上一个序列点和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次

C11 标准:

如果一个标量对象的副作用相对于同一标量对象的另一个副作用是未排序的,则行为未定义。

C99 标准的这个定义是否不完整,因此它在 C11 中进行了更新,因为它只包含术语 object 而不是 scalar object

【问题讨论】:

  • 在多线程的上下文中,可能与 C11 内存模型的改进有关
  • Afaik,C11 标准通常避免使用术语“序列点”。我相信它被认为与优化器(太严格)和可用性(我相信多线程是一个主要问题)交互不好。措辞的变化基本上用相对顺序的新概念取代了这个术语。
  • @cmaster-reinstatemonica 不,我相信这是由 C++11(C++14?)程序员创造的一些神话。序列点遍布 C11,在规范性文本中,以及总结它们的信息性附录 C。有时 C11 会说“sequenced before/after”,有时会说“有一个序列点”。
  • 也许您可以在other question 之前添加您的示例,以向其他人说明您对其他人的全部关注,正如我们在comments 中讨论的那样。
  • @RobertS 支持 Monica Cellio stackoverflow.com/a/61650429/13469230

标签: c object language-lawyer c99 c11


【解决方案1】:

这是因为 C11 试图涵盖多线程/并行执行。 “抽象机”中程序执行的基本规则在C99和C11(C11 5.1.2.3/3)之间增加了这段繁琐的文字:

Sequenced before 是评估之间的不对称、传递、成对关系 由单个线程执行,这会在这些评估中产生部分顺序。 给定任意两个评估 A 和 B,如果 A 在 B 之前排序,则 A 的执行 应先于 B 的执行。(相反,如果 A 在 B 之前排序,则 B 是 在 A 之后排序。)如果 A 不是在 B 之前或之后排序,那么 A 和 B 是 未排序的。当对 A 进行排序时,评估 A 和 B 的排序不确定 在 B 之前或之后,但未指定 which.13) 序列点的存在 在表达式 A 和 B 的评估之间意味着每个值计算和 与 A 相关的副作用在每个值计算和副作用之前排序 与 B 相关。(序列点的摘要在附件 C 中给出。)

因此,您引用的部分(C99 6.5/2)进行了相应更改,以适应抽象机中程序执行的定义,据说现在也涵盖了并行执行。不幸的是 - 因为 C99 文本更具可读性。从技术上讲,如果您不考虑并行执行,则根本没有任何改变。 C99 中关于序列点的规则仍然适用,只是措辞不同。此更改还意味着将 C11 与具有类似规则的 C++11 同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多