提问人:xmh0511 提问时间:7/11/2022 最后编辑:xmh0511 更新时间:7/14/2022 访问量:165
定义为实现定义行为的操作是否可以具有多种可能的执行?
Can an operation defined as implementation-defined behavior have multi possible execution?
问:
[conv.fpint] p2 说
如果要转换的值在可以表示的值范围内,但该值不能准确表示,则它是实现定义的下一个较低或较高可表示值的选择。
[intro.abstract] p2 说
在本文档中,抽象机器的某些方面和操作被描述为实现定义的(例如,)。这些构成了抽象机器的参数。每个实现都应包括描述其在这些方面的特性和行为的文档。此类文档应定义与该实现相对应的抽象机器的实例(以下称为“相应实例”)。
sizeof(int)
[intro.abstract] p5 说
执行格式良好的程序的符合要求的实现应产生与具有相同程序和相同输入的抽象机器的相应实例的可能执行之一相同的可观察行为。但是,如果任何此类执行包含未定义的操作,则本文档不要求使用该输入执行该程序的实现(甚至不要求在第一个未定义操作之前执行的操作)。
假设有一个实现,它不能在浮点类型的对象中精确地表示该值,并且该值的选择可以是 或 。对于转换评估的所有奇数时间,它选择较低的可表示值,对于转换评估的所有偶数时间,它选择较高的可表示值。这是一个符合要求的实现吗?16777217
16777216
16777218
float a1 = 16777217; // 16777216
float a2 = 16777217; // 16777218
.
.
.
float a<2n-1> = 16777217; // 16777216
float a<2n> = 16777217; // 16777218
更新:
一个类似的案例:
sizeof(int); // 4
sizeof(int); // 8
.
.
.
sizeof(int); // 4
sizeof(int); // 8
对于所有奇数次的求值,结果都是 ,对于所有偶数次的求值,结果都是 。sizeof(int)
4
sizeof(int)
8
答:
0赞
M.M
7/11/2022
#1
从技术上讲,是的。您已经引用了相关文本,因此我的回答将不包括任何进一步的引用。实现定义意味着实现必须记录它实现的行为。
除了您引用的文本中指定的内容外,对行为没有进一步的限制。这将是一个执行质量问题,即执行工作是记录单一成果还是一系列成果,以及在什么情况下记录,等等。
评论
0赞
xmh0511
7/11/2022
但是,该标准所要表达的选择的意图应该在程序中保持一致。查看 github.com/cplusplus/CWG/issues/91
0赞
user17732522
7/11/2022
在 [intro.abstract]/1 中,抽象机器被定义为“参数化 [和] 非确定性”。2 表示参数化是在标准中声明为实现定义的行为(产生一个特定的相应实例),3 表示非确定性部分是在标准中声明为未指定行为的行为。5 表示可观察行为必须与相应实例的可能执行之一匹配。在我看来,这似乎并不明显,这允许实现定义的行为包含进一步的非确定性。
0赞
xmh0511
7/11/2022
@user17732522 您如何看待此行为作为参数 [ 对于转换评估的所有奇数时间,它选择较低的可表示值,对于转换评估的所有偶数时间,它选择较高的可表示值。这是一个符合要求的实现吗?它被认为是参数化的还是不确定的?
0赞
user17732522
7/11/2022
@xmh0511 这在我看来完全是确定性的。它只是不能在程序的执行中本地决定。但是我在 [intro.abstract] 中没有看到任何需要此类属性的内容。(我认为)它只需要选择对任何给定的程序和输入都是确定性的。我猜这是否是参数化的允许选择将是一个不同的问题,当然似乎不是故意的。
0赞
xmh0511
7/11/2022
@user17732522 所以,你似乎同意问题中的实现是一个符合的实现。但是,对于这种情况,结果可能相似,您将注意到,在 github.com/cplusplus/CWG/issues/91#issuecomment-1179997771,实现定义行为的意图实际上要求相同输入的结果在程序中应该是一致的。sizeof(int)
评论
one of the possible
可能的执行是该值可以是 16777216 或 16777218。我有这个相关的 stackoverflow.com/questions/64740928/......