实现定义的行为是否需要在C++中的运行之间保持一致?

sha*_*oth 7 c++ compiler-construction implementation

符合标准的C++实现是否允许实现某些行为,这些行为据说是在标准中实现定义的,因为在具有相同输入数据的相同编译一次程序的不同运行之间它是不同的?

例如,一个实现是否允许说"行为是在周末,否则",并根据这样的声明实现行为?

Joh*_*itb 6

当然,如果实现文档确切的行为随着不同的运行而变化,那很好.请注意,实现定义的行为是抽象机器参数的一部分:

本国际标准中的语义描述定义了参数化的非确定性抽象机器.

抽象机的某些方面和操作在本国际标准中描述为实现定义的(例如,sizeof(int)).这些构成了抽象机器的参数.每个实施应包括描述其在这些方面的特征和行为的文件.这样的文档应该定义与该实现相对应的抽象机器的实例(在下面称为"相应的实例").

这不允许在单次运行的编译器中更改行为.但是在编译器的不同运行之间,编译器可以使用不同的对应抽象机器,根据实现定义的不同,抽象机器根据不同的实现定义值而不同.命令行参数-Wall(如更改实现定义的诊断消息集)是最常见的示例.除文档要求外,这与未指定的行为有所不同.未指定的行为限制性要小得多:

抽象机器的某些其他方面和操作在本国际标准中被描述为未指定的(例如,对函数的参数的评估顺序).在可能的情况下,本国际标准定义了一组允许的行为.这些定义了抽象机器的非确定性方面.因此,抽象机器的实例可以具有给定程序和给定输入的多于一个可能的执行序列.


Pra*_*rav 1

实现定义的行为意味着

\n\n
\n

Unspeci\xef\xac\x81ed 每个实现文档的行为如何做出选择的行为

\n
\n\n

这是强制性的记录特定实现的特定编程构造的行为

\n\n
\n

.....以这种方式,具有相同输入数据的相同编译一次程序的不同运行之间存在不同?

\n
\n\n

不!

\n\n
\n

例如,是否允许实现说“周末的行为是这样的,其他情况是这样的”并根据这样的声明实施行为?

\n
\n\n

我不确定,但我认为答案是否定的

\n

  • 我不明白为什么这是不允许的。标准说的是“如何做出选择”,而不是“做出哪一种选择”。 (4认同)
  • 在我看来,给出的实现定义行为的定义并不排除运行之间存在差异的可能性,只要它准确记录了每种情况发生的时间以及每种情况发生的情况。 (3认同)