我将从所使用术语的背景开始。
正确的
“在理论计算机科学中,当算法相对于规范正确时,算法的正确性就被断言了。” - 堆栈溢出的正确性标记。
不明确的
未定义的行为是允许任何事情发生的地方。实际上,可能发生的事情的可能性是无限的。示例是在 c++ 中取消引用 nullptr,并除以零。
定义明确
这是只有一个结果可能的地方。
实现定义
这是实现改变可能性数量的地方。如果某些实现定义的结果导致定义等同于未定义或明确定义,那么这不是我所指的。
未指定
这是存在大于一种但小于无限种可能性的地方。
利用未指定的行为
我指的是为了某些好处(但当然不限于)性能或程序的正确性,将您的程序开放给未指定的行为的想法。例如,将单线程程序转换为多线程程序可能会“利用”未指定的行为来谋取利益。
这个想法
这就是事情变得有趣的地方。或者,至少潜力是存在的。这是编程的灰色地带。有一些关于什么可以或不可以发生的想法,但是发生的事情既不是明确定义的,也不是未定义的。
一个简单且使用良好的示例将涉及多线程。在使用多个线程时,还有很多未知和不可知的地方。尽管如此,还是使用了多个线程,因为它带来了可能无法获得的主要性能提升。
在不牺牲正确性的情况下,有意识地实施未指定的行为还能带来哪些好处? 需要有一些好处。
对于那些可能想要结束这个想法的人,这将邀请基于意见的答案 - 我反驳说,基于专业知识要求答案的问题是一个例外,并且是允许的。这是我认为这个问题有效且可以接受的基础。这是一个可以回答的问题。
在具体参考我之前类似的问题时,我重新提问是因为我没有正确地表达这个问题。我已经对其进行了重新措辞,现在特别要求在不牺牲程序正确性的情况下显示好处的答案。